oledb的OleDbParameter的问题! 各位高手请解答啊!!多谢了

raykenio 2004-12-21 04:18:02
我用OleDbParameter来执行一个Sql语句,语句如下:
upd.CommandText = "update IdeaInfo set IfSolve = 1 where Only_ID=@id";
System.Data.OleDb.OleDbParameter id = upd.Parameters.Add("@id",System.Data.OleDb.OleDbType.Char,16);
id.Value = e.Item.Cells[0].Text.Trim();

编译没有问题!但执行时老说:必须声明变量 '@id'。
同样的语句使用SqlParameter就不会出现问题!!

请问这是怎么回事? 怎样让其在OleDb下执行正常? 多谢!!
...全文
313 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
raykenio 2004-12-22
  • 打赏
  • 举报
回复
问题解决!下面是解决后的代码!
upd.CommandText = "update IdeaInfo set IfSolve = 1 where Only_ID=?";
System.Data.OleDb.OleDbParameter id = new System.Data.OleDb.OleDbParameter("?",System.Data.OleDb.OleDbType.Char,16);
upd.Parameters.Add(id);
id.Value = id;
upd.Connection = Conn.GetOleDb();
upd.ExecuteNonQuery();
upd.Dispose();
只要把Sql语句中的'@id'换成'?',再在后面声明'?'就行了!!
感觉有点怪异啊!!!呵呵!! 不过反正行了! 但之是在一个变量的情况下行通了!

结………………………………!
aoyo 2004-12-21
  • 打赏
  • 举报
回复
如果 CommandType 设置为 Text,OLE DB .NET 提供程序不支持将参数传递给 OleDbCommand 调用的 SQL 语句或存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:

SELECT * FROM Customers WHERE CustomerID = ?

因此,向 OleDbParameterCollection 添加 OleDbParameter 对象的顺序必须直接对应于该参数的问号占位符在命令文本中的位置。

这是MS的例子
OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection);
myCommand.CommandText = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?";
myCommand.Parameters.Add(myParamArray);
for (int j=0; j<myParamArray.Length; j++)
{
myCommand.Parameters.Add(myParamArray[j]) ;
}


Overriding 2004-12-21
  • 打赏
  • 举报
回复
myCommand.CommandText = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?"
用 ?
+++++++++++++++++++++++++++++++++++++
我看过的有些书上也是这么说的,加参数也是像用@ssss这样加,我自己没有试过,刚做的项目用access就按楼主那么用没有出错!
goody9807 2004-12-21
  • 打赏
  • 举报
回复
System.Data.OleDb.OleDbParameter id = new System.Data.OleDb.OleDbParameter("@id",System.Data.OleDb.OleDbType.Char,16);


upd.Parameters.Add(id);

raykenio 2004-12-21
  • 打赏
  • 举报
回复
要求就是我前面写的类似方法,不使用存储过程。

to:aoyo(遨游)
你说的用“?”但我该怎么把条件值写入“?” ?

因为有些原因不能用存储过程,要完全用程序来控制存储!

我给一个我的比较完整的出之前说的问题的程序:
//初始OleDbCommand。
System.Data.OleDb.OleDbCommand upd = new System.Data.OleDb.OleDbCommand();
//设定Sql语句
upd.CommandText = "update IdeaInfo set IfSolve = 0 where Only_ID=@id";
//设定@变量
System.Data.OleDb.OleDbParameter id = upd.Parameters.Add("@id",System.Data.OleDb.OleDbType.Char);
id.Value = e.Item.Cells[0].Text.Trim();
//取得连接
upd.Connection = Conn;
//执行
upd.ExecuteNonQuery();
//销毁
upd.Dispose();
//----------------------------------------
以上的语句都用SqlClient的话就不会有任何问题!
但我现在都要用OleDb! 就会出现:必须声明变量 '@id'。
我该怎么改才会不出现那样的错误!!?? 多谢各位高手!!!
aoyo 2004-12-21
  • 打赏
  • 举报
回复
myCommand.CommandText = "SELECT CustomerID, CompanyName FROM Customers WHERE Country = ? AND City = ?"
用 ?
goody9807 2004-12-21
  • 打赏
  • 举报
回复
存储过程 应该没问题吧

例子
protected void createdatasource(int current_page)
{
string str_table_name,str_column_list,str_order_column,str_condition;
//查询的表名
str_table_name="employees";
//返回的列名列表
str_column_list="employeeid,firstname,lastname,title";
//排序列的列名
str_order_column="employeeid";
//查询的表件
str_condition="employeeid>0";
string strConn = "DATABASE=Northwind;SERVER=localhost;UID=sa;PWD=;";
SqlConnection conn = new SqlConnection(strConn);
//声明执行存储过程的SqlCommand
SqlCommand scd_sel=new SqlCommand("up_custompage",conn);
scd_sel.CommandType=CommandType.StoredProcedure;
//给存储过程的参数赋值
SqlParameter sp_temp;
sp_temp=scd_sel.Parameters.Add("@vc_order_column_name",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_order_column;
sp_temp=scd_sel.Parameters.Add("@vc_select_column_list",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_column_list;
sp_temp=scd_sel.Parameters.Add("@vc_select_table_list",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_table_name;
sp_temp=scd_sel.Parameters.Add("@vc_condition",SqlDbType.VarChar,100);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=str_condition;
sp_temp=scd_sel.Parameters.Add("@page_size",SqlDbType.Int);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=grid.PageSize;
sp_temp=scd_sel.Parameters.Add("@current_page",SqlDbType.Int);
sp_temp.Direction=ParameterDirection.Input;
sp_temp.Value=current_page;
sp_temp=scd_sel.Parameters.Add("@total1",SqlDbType.Int);
sp_temp.Direction=ParameterDirection.Output;

//执行存储过程
SqlDataAdapter sda=new SqlDataAdapter();
sda.SelectCommand=scd_sel;
if (conn.State==ConnectionState.Closed)
conn.Open();
DataSet ds=new DataSet();
sda.Fill(ds,"tb1");
conn.Close();
//设置VirtualItemCount属性
grid.VirtualItemCount=(int)scd_sel.Parameters["@total1"].Value;
//绑定数据源
grid.DataSource=ds.Tables["tb1"].DefaultView;
grid.DataBind();
}

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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