为什么OLEDB方式写SQL语句的时候只能传值不能传址的

zhnzzy 2009-04-03 11:39:18
写了两句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,不知道具体什么原因,请遇到过该问题的朋友来解释一下吧


...全文
150 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhnzzy 2009-04-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhoufoxcn 的回复:]
最后吧SQL语句换成存储过程就没有问题,本人很少用OLEDB方式连接 SQL SERVER,不知道具体什么原因,请遇到过该问题的朋友来解释一下吧
=====================================================
如果你使用的是SQL Server2000以上的版本就尽量不要用OLEDB方式连接 SQL SERVER了,那样会不能使用SQL Server的一些特性了。
[/Quote]
恩.不错,我用OLEDB主要也是我写了降几种连接方式一个一个都写了个通用访问类方便使用的
周公 2009-04-06
  • 打赏
  • 举报
回复
最后吧SQL语句换成存储过程就没有问题,本人很少用OLEDB方式连接 SQL SERVER,不知道具体什么原因,请遇到过该问题的朋友来解释一下吧
=====================================================
如果你使用的是SQL Server2000以上的版本就尽量不要用OLEDB方式连接 SQL SERVER了,那样会不能使用SQL Server的一些特性了。
周公 2009-04-06
  • 打赏
  • 举报
回复
需要说明的是,除了Access之外,操作其它数据库可以不必要按照参数在SQL语句中出现的顺序添加进去一样可以正确执行,但是在Access中一定按照插入的列的顺序添加参数,因为“OLE DB.NET Framework 数据提供程序使用标有问号 (?) 的定位参数,而不使用命名参数(MSDN)”,所以给添加参数和赋值一定要按照列的顺序。
通过上面的例子,基本上可以总结出一个规律:在参数化SQL中参数名的格式跟其在存储过程中生命存储过程参数一致,例如在Oracle中存储过程参数一律以”:”开头,在MS SQL Server中存储过程参数一律以”@”开头,而在MySQL中存储过程(MySQL从5.0以后版本支持存储过程)参数一律以“?”开头,所以在参数化SQL语句中参数名有些不一样(记得在csdn上有朋友提到过不知道为什么MySQL中参数化SQL语句中要用“?”而不是和SQL Server一样使用”@”),如果那位朋友看过本文,我想他就会解开这个疑虑了。
周公 2009-04-06
  • 打赏
  • 举报
回复
在ADO.NET中使用参数化SQL语句的大同小异
在ADO.NET中经常需要跟各种数据库打交道,在不实用存储过程的情况下,使用参数化SQL语句一定程度上可以防止SQL注入,同时对一些较难赋值的字段(如在SQL Server中Image字段,在Oracle中Clob字段等)使用参数化SQL语句很容易就能赋值,所以本人经常在ADO.NET中使用参数化SQL语句,近几年来陆续跟SQL Server/Oracle/ MySQL/Access打交道,积累了一些心得,现在整理出来供大家参考。
kkun_3yue3 2009-04-05
  • 打赏
  • 举报
回复
好像是这样的。。。
只能根据顺序来加载参数。。。。
所有参数都用?表示。。。
waiter0425 2009-04-04
  • 打赏
  • 举报
回复
你直接把SELECT * FROM tb WHERE a=@a and b =@b 这句放到查询分析器里执行也是这样的
@ 相当于编程中的关键字
cppfaq 2009-04-04
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
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();
}

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧