我一直在網上搜索,但我似乎無法找到任何解釋我的問題(可能是因爲我沒有使用正確的搜索字符串),所以我在這裏張貼希望有人能幫助我。 (我的程序編寫的是使用Visual Studio 2010的C#)SqlCommand參數與String.Format
我注意到在C#中,有多種構建SQL命令的方法。
SqlConnection connection = GetAndOpenConnection(); //function containing connection string and open connection
SqlCommand command = connection.CreateCommand();
到目前爲止,我沒有任何問題。我遇到的問題是CommandText
。我在我的代碼中使用了幾個不同的命令(SELECT
/INSERT
/UPDATE
/DELETE
),但以SELECT
爲例。
//Example 1:
command.CommandText = String.Format("SELECT * FROM myTable WHERE name = '{0}'", "bob");
//Example 2:
command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
command.Parameters.Add(new SqlParameter("myName", "bob"));
以上兩個例子有什麼區別? (性能明智/結構明智/等)
我問的原因是因爲在同一個.cs文件中,當我使用示例2中的方法,有時代碼正常工作,有時它不,那麼我最終會像例1中的每一個例子一樣工作。
使用這兩種方法是否有重大收益/損失?哪種方法可以完成這樣的任務?
另一個問題
好了,所以我看到方法2是更合適的方式來做到這一點。
不過,如果我使用方法2
有一個問題,我有一個循環通過List<string> names
這個循環。在循環內部,當我使用方法2並添加名稱作爲參數時,出現錯誤,說明參數已經存在,無法添加。
我該如何解決這個問題?
List<string> names = new List<string> {"adam", "bob", "john"};
foreach(string name in names)
{
command.CommandText = "SELECT * FROM myTable WHERE name = @myName";
command.Parameters.Add(new SqlParameter("myName", name));
reader = command.ExecuteReader();
while(reader.Read())
{
//loop through each cell and print on the Console
}
}
而且,我知道人們提到,在參數應該是"@myName"
而不是"myName"
。我記得有這個問題,因爲我很困惑使用哪種方式,只能測試它。 "@myName"
對我來說不起作用,但是"myName"
就是這樣,這就是它現在在我仍然使用方法2的部分的代碼。我使用的是.Net 4.0,不知道這是否會有所作爲。
另外你沒有正確添加參數:在每次迭代中使用後
您需要處置命令,在添加參數時它應該以'@'開頭。 – Habib
http://bobby-tables.com/ – Habib
你可以顯示其他問題的代碼嗎? – Andrei