你不要用命名的参数,要用占位符,因为OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序不支持用于将参数传递到 SQL 语句或存储过程的命名参数。在此情况下,必须使用问号 (?) 占位符,如下为正的:
string strSql = "SELECT name,id FROM users WHERE id =?";//注意这里的'?'号
string strConnect = "Provider = SQLOLEDB;Data Source=(local);Initial Catalog=test;Integrated Security=SSPI";
OleDbConnection cn = new OleDbConnection(strConnect);
cn.Open();
OleDbCommand cmd = new OleDbCommand(strSql,cn);
cmd.Parameters.Add("@nameid",OleDbType.VarChar,8);
cmd.Parameters[0].Value = "5";
OleDbDataReader rdr;
rdr = cmd.ExecuteReader();
int intName = rdr.GetOrdinal("name");
while (rdr.Read())
{
  if (rdr.HasRows)
   {
     System.Console.WriteLine(rdr.GetString(intName));
   }
}
你试试先.

解决方案 »

  1.   

    非常感谢 hbxtlhx(下着春雨的天) 的指教!
    成功了!也就是说sql语句的参数只能用?来代替?而不能用@__的形式?不管是查询语句还是存储过程吗?
      

  2.   

    如果你用的是SqlCommand则不是这样的,因为微软以把它写的很好用了,可以使用命名的参数,就是你以前写的一样,可是如果不是Sql开头的则不能这样使用,只能用占位符,一一对应的参数才行.
      

  3.   

    不管是查询语句还是存储过程,都是一样的.所以如果用SqlServer的话,最好用Sql开头的类,如果不是SqlServer就你就要使用ole的或是odbc的.这个是个建议.
      

  4.   

    string strSql = "SELECT name,id FROM users WHERE id =@nameid";
    这是在用SqlConnection时用的“@",oledb用“?”代替,