30. december 2004 - 18:47Der er
8 kommentarer og 1 løsning
SqlDataReaders late bound parameter
Jeg oensker at spoerge om en hvis kolonne er i datareaderen, kan det lade sig goere?
Lidt a la:
if(dtr.Contains("KolonneNavn")) var = dtr["KolonneNavn"];
Jeg kan se at man kan faa alle kolonne navnene ud, men det er vist lige lovligt voldsomt at skulle hente alle kolonne navnene ud bare for at checke for dette.
Det er også muligt at hente tabellens skema ud i en tabel og på den kontrollere om det givne kolonnenavn eksisterer: public static bool DoesReaderContainColumn(IDataReader reader,string columnName) { DataTable dt = reader.GetSchemaTable(); DataRow [] rows = dt.Select("ColumnName='" + columnName + "'"); return rows.Length != 0; }
Jeg synes ikke det er kønt at bruge en try ... catch til formålet, men det virker fint. Jeg har lavet en hurtig test, og jeg kan ikke måle nogen forskel i hastighed på de forskellige metoder. Dog fandt jeg ud af, at hvis kolonnen ikke eksisterer er try ... catch metoden langsomst idet exception handlingen er tidskrævende. Hvis kolonnen eksisterer kan jeg ikke måle nogen forskel.
a1>> Grunden til dette er rent kosmetisk. Derfor syntes jeg ikke at try - catch er en koenloesning. driss>> dit forslag er godt... jeg har kigget lidt paa dette: dr.GetSchemaTable().Columns.Contains("KolonneNavn");
gooky >> Jeg har testet med flg. simple eksempel. Som du sikkert kan se er forskellen performancemæssigt så lille at jeg ikke mener det bør have indflydelse på dit valg af metode - med mindre du skal bruge metoden ekstremt ofte.
using System; using System.Data; using System.Data.SqlClient;
namespace ReaderTest { /// <summary> /// Summary description for Class1. /// </summary> class Class1 { [System.Runtime.InteropServices.DllImport("KERNEL32")] private static extern bool QueryPerformanceCounter(ref long lpPerformanceCount); [System.Runtime.InteropServices.DllImport("KERNEL32")] private static extern bool QueryPerformanceFrequency(ref long lpFrequency);
/// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main(string[] args) { long frequency = 0, startTime = 0, endTime = 0; float elapsed = 0; QueryPerformanceFrequency(ref frequency);
SqlConnection conn = new SqlConnection(CONNECTIONSTRING); conn.Open(); SqlCommand com = new SqlCommand("SELECT * FROM tblProducts",conn); SqlDataReader sdr = com.ExecuteReader(CommandBehavior.CloseConnection);
I øvrigt er grunden til: dr.GetSchemaTable().Columns.Contains("KolonneNavn");
ikke virker, at GetSchemaTable returnerer en tabel der definerer dataskemaet. Denne tabel indeholder så en række for hver kolonne i din data reader. Disse rækker indeholder information om hver enkelt kolonne i datareaderen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.