惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
宝玉的分享
宝玉的分享
V
V2EX
MongoDB | Blog
MongoDB | Blog
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
博客园 - 聂微东
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
美团技术团队
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
Hugging Face - Blog
Hugging Face - Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
B
Blog RSS Feed

博客园 - ShelleyZhang

悬浮框实现 C#操作xml SelectNodes,SelectSingleNode总是返回NULL 与 xPath 介绍 ODBC驱动重新注册 .net 连接 Sybase 影响行数问题——续 .net 连接 Sybase 影响行数问题 下载最新全国邮编数据库 windows 7(x86) IE8 下的 owc Who knows Microsoft.XMLDOM相关资料 XML to Excel - ShelleyZhang 使用windows7的System帐户 C# 位域[flags] - ShelleyZhang - 博客园 VS.NET 控件命名规范 DNN初探(第二小时) DNN 初探(第一小时) 工作总结(临时存放一下) 中文vs2008安装 mvc 1 今天到了1000分了,庆祝一下 asp超过响应缓冲区限制的解决方法
.net用OLEDB方式操作SqlServer和Sybase
ShelleyZhang · 2010-05-25 · via 博客园 - ShelleyZhang

【错误一】 SqlServer提示错误:OleDbException 必须声明标量变量

今天用.net使用Oledb的方式操作SqlServer,却总是莫名其妙的报“必须声明标量变量…”,在代码里面分别采用了下面的两种方式,都无济于事:

方法一:
OleDbParameter[] p = new OleDbParameter[] { 
    new OleDbParameter("@aa",1),
    new OleDbParameter("@bb","shelley"),
    new OleDbParameter("@cc",DateTime.Now)
};
Objcmd.Parameters.AddRange(p);

方法二:
OleDbParameter pp;
pp = new OleDbParameter("@aa",OleDbType.Integer);
pp.Value = 1;
Objcmd.Parameters.Add(pp);
pp = new OleDbParameter("@bb", OleDbType.LongVarChar);
pp.Value = "shelley";
Objcmd.Parameters.Add(pp);
pp = new OleDbParameter("@cc", OleDbType.Date);
pp.Value = DateTime.Now;
Objcmd.Parameters.Add(pp);
无论怎么样写,都会提示“必须声明标量变量@aa”,最终的原因是下面这句:
OleDbCommand Objcmd = new OleDbCommand("insert into test (a,b,c)values(@aa,@bb,@cc)", Objconn);
正确写法:
OleDbCommand Objcmd = new OleDbCommand("insert into test (a,b,c)values(?,?,?)", Objconn);
这样就正常通过了。
 
【错误二】Sybase提示错误:不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))

.net用Oledb操作Sybase,因为在一个sql语句中可能会多次用到同一个参数,代码如下:

OleDbCommand Objcmd = new OleDbCommand("update test set a=@aa where a=@aa", Objconn);
OleDbParameter[] p = new OleDbParameter[] { 
    new OleDbParameter("aa",1),
    new OleDbParameter("aa",1)
};
Objcmd.Parameters.AddRange(p);
Objconn.Open();
Objcmd.ExecuteNonQuery();
Objconn.Close();

上面的代码就会提示“不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))”错误。问题原因在于参数中存在两个相同名字,对于这种情况只需要写一个参数就可以了,改动如下:

OleDbCommand Objcmd = new OleDbCommand("update test set a=@aa where a=@aa", Objconn);
OleDbParameter[] p = new OleDbParameter[] { 
    new OleDbParameter("aa",1)
};

OleDbCommand Objcmd = new OleDbCommand("update test set a=@aa where a=@aa2", Objconn);
OleDbParameter[] p = new OleDbParameter[] { 
    new OleDbParameter("aa",1),
    new OleDbParameter("aa2",1)
};

【总结】

如果写一个程序,需要支持SqlServer和Sybase的时候这个地方需要特别注意:

1.SqlServer需要用“?”作为参数占位符,这样要求即使用到了同一个参数,也必须多次添加Parameter;

2.Sybase如果多次使用同一个参数,不能多次添加Parameter,否则会报错;