写了两句SQL分别是 string sql = "SELECT * FROM tb WHERE a=@a and b =@b ";//这句传入报错,说要声明标量变量@a 和@B弄了半天换了种写法
string sql = "SELECT * FROM tb WHERE a=? and b =? ";这据就可以得到正确结果了最后吧SQL语句换成存储过程就没有问题,本人很少用OLEDB方式连接 SQL SERVER,不知道具体什么原因,请遇到过该问题的朋友来解释一下吧
string sql = "SELECT * FROM tb WHERE a=? and b =? ";这据就可以得到正确结果了最后吧SQL语句换成存储过程就没有问题,本人很少用OLEDB方式连接 SQL SERVER,不知道具体什么原因,请遇到过该问题的朋友来解释一下吧
@ 相当于编程中的关键字
{
string connstr = "Provider=SQLOLEDB;Data Source=.;Integrated Security=SSPI;Initial Catalog=Northwind"; OleDbConnection conn = new OleDbConnection(connstr); OleDbCommand comm = new OleDbCommand();
comm.Connection = conn; // 参数占位符一定要用?,@被当成是游标关键字
comm.CommandText = "select CompanyName from Customers where CustomerID = ? and ContactTitle = ?"; // 参数一定要按次序添加,名字随便取
OleDbParameter para = comm.Parameters.Add("@CuserID", OleDbType.Char, 5);
para.Value = "ANTON";
OleDbParameter para2 = comm.Parameters.Add("@CoTitle", OleDbType.VarChar, 30);
para2.Value = "Owner";
conn.Open();
string CompanyName = (string)comm.ExecuteScalar();
conn.Close();
Console.WriteLine(CompanyName);
Console.ReadLine();
}
在ADO.NET中经常需要跟各种数据库打交道,在不实用存储过程的情况下,使用参数化SQL语句一定程度上可以防止SQL注入,同时对一些较难赋值的字段(如在SQL Server中Image字段,在Oracle中Clob字段等)使用参数化SQL语句很容易就能赋值,所以本人经常在ADO.NET中使用参数化SQL语句,近几年来陆续跟SQL Server/Oracle/ MySQL/Access打交道,积累了一些心得,现在整理出来供大家参考。
通过上面的例子,基本上可以总结出一个规律:在参数化SQL中参数名的格式跟其在存储过程中生命存储过程参数一致,例如在Oracle中存储过程参数一律以”:”开头,在MS SQL Server中存储过程参数一律以”@”开头,而在MySQL中存储过程(MySQL从5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化SQL语句中参数名有些不一样(记得在csdn上有朋友提到过不知道为什么MySQL中参数化SQL语句中要用“?”而不是和SQL Server一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。
=====================================================
如果你使用的是SQL Server2000以上的版本就尽量不要用OLEDB方式连接 SQL SERVER了,那样会不能使用SQL Server的一些特性了。