Es gibt eine weitere Frage dazu:Wann sollten "SqlDbType" und "size" beim Hinzufügen von SqlCommand-Parametern verwendet werden?
What's the best method to pass parameters to SQLCommand?
Aber ich bin zu wollen wissen, was die Unterschiede sind und wenn es irgendwelche Probleme mit den verschiedenen Möglichkeiten.
Normalerweise verwende ich eine Struktur, etwa wie folgt:
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(SQL, conn))
{
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = Settings.Default.reportTimeout;
cmd.Parameters.Add("type", SqlDbType.VarChar, 4).Value = type;
cmd.Connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.Fill(ds);
}
//use data
}
Nun gibt es mehrere Möglichkeiten, die cmd Parameter hinzuzufügen, und ich frage mich, was am besten ist:
cmd.Parameters.Add("@Name", SqlDbType.VarChar, 20).Value = "Bob";
cmd.Parameters.Add("@Name", SqlDbType.VarChar).Value = "Bob";
cmd.Parameters.Add("@Name").Value = "Bob";
cmd.Parameters.AddWithValue("@Name", "Bob");
die Länge der Having Feld in der Weitergabe der Varchars ich nehme an, ist nicht vorzuziehen, da es ein magischer Wert ist, der später in der Datenbank geändert werden kann. Ist das richtig? Wenn irgendein Problem auftritt, das auf diese Weise ein varchar (Leistung oder anderes) passiert, nehme ich an, dass es standardmäßig auf varchar (max) oder die Datenbank entspricht. Ich bin einigermaßen glücklich, dass das funktionieren wird.
Der Teil, der mich mehr betrifft, ist der Verlust der SqlDbType-Enumeration, wenn ich die dritte oder vierte Option verwende, die ich oben aufgeführt habe, stelle ich überhaupt keinen Typ bereit. Gibt es Fälle, wo dies nicht funktioniert Ich kann mir vorstellen, Probleme mit Varchar in Char falsch umgewandelt oder umgekehrt oder vielleicht Probleme mit Dezimal zu Geld ....
In Bezug auf die Datenbank der Feldtyp würde ich sagen viel weniger wahrscheinlich als die Länge zu ändern, ist es also wert, zu behalten?
Während Sie Ihre Frage nicht beantworten, wissen Sie, dass Sie die Verbindung nicht vor dem Aufruf von 'SqlDataAdapter.Fill()' öffnen müssen, und dass es von Vorteil ist, dies nicht zu tun? –
@Rowland guten Punkt. Ich wusste das, obwohl es in meinem Code ein Versehen war. Ich glaube, ich habe den ursprünglichen Codeblock von irgendwo genommen, dass ich einen SqlDataReader nicht einen Adapter verwendet habe (Sie müssen die Verbindung für dieses Recht öffnen?). Das bekommst du für eine ungeeignete Copy/Paste-Programmierung :-). In meinem Code jetzt behoben. – PeteT
nur gedacht, ich würde es erwähnen, wie es ist eine dieser "obskuren Tipps, die Menschen vielleicht nicht wissen" –