我一直在网上搜索,但似乎找不到任何解释我的问题的东西(可能是我没有使用正确的搜索字符串),所以我在这里发帖,希望有人能帮助我。(我的程序是使用Visual Studio 2010编写的C#)
我注意到在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是更合适的方法。然而,如果我使用方法2就会出现问题。我有一个循环,循环遍历List 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"
。我记得当时遇到了这个问题,因为我不确定该采用哪种方式,所以只能进行测试。在我使用方法2的部分中,"@myName"
不能正常工作,但"myName"
可以,而且现在代码中仍然是这样的。我正在使用.Net 4.0,不知道是否会有影响。
@
开头。 - Habib