大家注意,这绝对不是一个很低级的问题,请慎重发言:  ^^b
这是我的函数:
=======================================================================
public bool UserExist( string strUserID)
{
OleDbCommand cmd = new OleDbCommand( 
@"SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserID ", m_conn );

cmd.Parameters.Add( "@strUserID", OleDbType.VarWChar,50 );
cmd.Parameters["@strUserID"].Value =strUserID.Trim();

bool bExist = false; m_conn.Open(); bExist = (int)cmd.ExecuteScalar() > 0; m_conn.Close(); return bExist;
}错误消息:
======================================================================“/Zgsy”应用程序中的服务器错误。
--------------------------------------------------------------------------------必须声明变量 '@strUserID'。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 必须声明变量 '@strUserID'。源错误: 
行 91:  m_conn.Open();
行 92: 
行 93:  bExist = (int)cmd.ExecuteScalar() > 0;
行 94: 
行 95:  m_conn.Close();
 堆栈跟踪: [OleDbException (0x80040e14): 必须声明变量 '@strUserID'。]
...................
 

解决方案 »

  1.   

    去掉空格
    OleDbCommand cmd = new OleDbCommand(
    @"SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserID", m_conn );
      

  2.   

    那应该没有什么错误。System.Data.OleDb.OleDbParameter PUserID = new OleDbParameter("@strUserID", System.Data.OleDb.OleDbType.VarChar,50); 
    PUserID.Value = strUserID.Trim(); 
    cmd.Parameters.Add(PUserID);这样可以么?
      

  3.   

    这样试试
    OleDbCommand cmd = new OleDbCommand("SELECT COUNT(1) FROM [T_USER] WHERE CardID = @strUserID", m_conn );
      

  4.   

    恕小弟冒昧的问一下:
    您以前一直用@id方式声明变量,数据源是oledb还是sql呢
    如果连接oledb是不是oledb不支持@id命名方式,而尽支持?命名方式
    sql不支持?命名方式而今支持@id命名方式小弟冒昧,浅薄无知,受教了。
      

  5.   

    同意楼上。不是随便写@strUserID的,你至少先要说说你到底使用什么数据库,以及什么OLE驱动版本。
      

  6.   

    try..public bool UserExist( string strUserID)
    {
    OleDbCommand cmd = new OleDbCommand( 
    "SELECT COUNT(1) FROM T_USER WHERE CardID = ? ", m_conn );cmd.Parameters.Add( "@strUserID", OleDbType.VarWChar,50 );
    cmd.Parameters["@strUserID"].Value =strUserID.Trim();bool bExist = false;m_conn.Open();bExist = (int)cmd.ExecuteScalar() > 0;m_conn.Close();return bExist;
    }
      

  7.   

    不行的话,直接这样:public bool UserExist( string strUserID)
    {
    OleDbCommand cmd = new OleDbCommand( 
    "SELECT COUNT(1) FROM T_USER WHERE CardID = ?", m_conn );//如果是VS2005用AddWithValue,Vs2003用Add方法
    cmd.Parameters.AddWithValue("@strUserID",strUserID.Trim());
    bool bExist = false;m_conn.Open();bExist = (int)cmd.ExecuteScalar() > 0;m_conn.Close();return bExist;
    }
      

  8.   

    OleDb在添加参数时用"?",而不是用"@参数名"..
      

  9.   

    我用了一阵 '?',可是当我执行复合查询的时候,同一个参数的值要用到多次,
    而且根据特定条件的不同,所使用的参数的次数也不同。所以,我对显式命名参数有需求。
    回楼上几个朋友:
    我用的是vs.net 2003数据库是SQL Server这种搭配方式使用了2年多都没有出现过问题 >_<
      

  10.   

    to:net_lover(【孟子E章】) 
    写成这样也不行,还是那个错误
    ===================================================================================
    System.Data.OleDb.OleDbParameter PUserID = new OleDbParameter("@strUserID", System.Data.OleDb.OleDbType.VarChar,50); 
    PUserID.Value = strUserID.Trim(); 
    cmd.Parameters.Add(PUserID);
      

  11.   

    我不知道楼上几位非要我说出数据类型是什么意思? 这个程序在部署的时候可能会该用Oracle,我在查询的时候尽量用的标注的SQL语句
    参数的问题应该和数据库没有关系吧
      

  12.   

    因为只有部分的 OleDb 驱动支持 @参数 形式。
    如果你确定你的程序中别的地方可以使用 @参数 形式写查询参数,只是这个地方不行,可以改成更可靠的写法:public bool UserExist( string strUserID)
    {
    DbCommand cmd = m_conn.CreateCommand();
    cmd.CommandText="SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserID ";DbParameter adp = cmd.CreateParameter();
    adp.ParameterName = "@strUserID";
    adp.Value = strUserID.Trim();;
    cmd.Parameters.Add(adp);bool bExist = false;m_conn.Open();  //这个应该在外边打开?bExist = (int)cmd.ExecuteScalar() > 0;m_conn.Close(); //这个应该在外边关闭?return bExist;
    }
      

  13.   

    "Provider=SQLOLEDB;Server=.;DATABASE=zgsy;UID=sa;pwd="我这次是这么写的
    大家要是觉得我的连接字符串写的有问题,
    不妨给贴出两个自己平时使用的。
      

  14.   

    "Provider=sqloledb;Data Source=.;Initial Catalog=zgsy;User Id=sa;Password=;";还有就是这样写,都一样
      

  15.   

    Open、Close方法与Connection的创建分离的那么遥远,很坏的味道。要么把创建 m_conn 实例的代码放到 UserExist 里边来,要么把 Open、Close 拿到 UserExist 外边去。对于连接缓冲池,只有你创建新连接的时候才能使用到缓冲池。你并不创建新的 m_conn 实例,把一个 m_conn 传来传去,反而减少了并发连接,增加了冲突。
      

  16.   

    这个程序在部署的时候可能会该用Oracle,我在查询的时候尽量用的标注的SQL语句
    ———————————————————————————————————————————
    其实不论是 SqlCommand 还是 OracleCommand,都是从 DbCommand 继承的。对于Parameters、DbConnection等也是如此。你直接使用ADO.NET一般化类来达到兼容的目的,在换数据库的时候换一条 DbFactory 创建命令或者是 DbConnection创建命令。使用System.Data.SqlClient和System.Data.OracleClient,而不应该使用 OleDB。
      

  17.   

    @"SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserID "
    小弟认为要去掉“@”="SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserId"这样我想是可以的,我一直都是这样的。献丑了。
      

  18.   

    DbParameter adp = cmd.CreateParameter();
    adp.ParameterName = "@strUserID";
    adp.Value = strUserID.Trim();;
    cmd.Parameters.Add(adp);这种方法根本就不行,上面已经有一个朋友这么讲过了,我也早就回复说不能用了....
      

  19.   

    to: sp1234我的问题不是到底是使用SQL还是Oracle
    而是如何使用正确使用OleDB
      

  20.   

    你自己确信你是在 SQLOleDB 驱动下使用了“两年多” @参数 方式的参数化查询?
      

  21.   

    其实你那种对 @参数 形式的SQL写法的“自信”,让人联想到你似乎根本不是使用 SqlOleDB的。反倒是会联想到 SqlClient 或者 Access(然而在Access的OleDB驱动下@其实等价于SqlOleDB的“?”符号,必须按照查询中的参数顺序添加Parameter,@后边的变量名称反而客户胡乱写)。
      

  22.   

    .net下用的SqlDB+SQL Server, OleDB+Access,OleDB+ MS SQL
      

  23.   

    啊,这样啊,那我用SqlClient是不是就好了?
      

  24.   

    sql server 用 SqlClient最好,SqlClient是专门为sqlseerver制作的,性能最好。
      

  25.   

    平时都用SqlClient的。SQL下OleDB还真是有点奇怪试验了2种方法System.Data.OleDb.OleDbConnection cn;
    System.Data.OleDb.OleDbCommand cmd;
    System.Data.OleDb.OleDbDataReader dr;cn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("aspxWeb.mdb"));
    cn.Open();
    cmd = new System.Data.OleDb.OleDbCommand("select * from Document Where id=@id",cn);
    cmd.Parameters.Add("@id", System.Data.OleDb.OleDbType.Integer, 50);
    cmd.Parameters["@id"].Value = 1;    
    dr = cmd.ExecuteReader();
    Response.Write(dr.HasRows);
    dr.Close();
    cn.Close();cn = new System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB;Data Source=.;User ID=sa;Initial Catalog=EdustarApplication");
    cn.Open();
    cmd = new System.Data.OleDb.OleDbCommand("select * from EduUser Where id = ?", cn);
    cmd.Parameters.Add("@id", System.Data.OleDb.OleDbType.Integer, 50);
    cmd.Parameters["@id"].Value = 1;    
    dr = cmd.ExecuteReader();
    Response.Write(dr.HasRows);
    dr.Close();
    cn.Close();
      

  26.   

    你用SQL Server就用SqlCommand嘛,OleDbCommand依赖于它调用的驱动,如果是Access之类的就不能用@参数只能用?代表参数。
      

  27.   

    是不是見鬼了,我今天才用
    OleDb 操作Access2000數據庫
    也用@ID參數來的,為什麼沒有出錯啊????
      

  28.   

    public static DataSet getDataSet(OleDbConnection conn, OleDbTransaction trans, string SQLstr, OleDbParameter[] param, string tablename)
            {
                string[] sql;
                sql = SQLstr.Split("|".ToCharArray());
                OleDbDataAdapter da = new OleDbDataAdapter();
                DataSet ds = new DataSet();
                OleDbCommand cmd = new OleDbCommand();
                cmd.Connection = conn;
                if (trans != null)
                {
                    cmd.Transaction = trans;
                }
                foreach (OleDbParameter pa in param)
                {
                    cmd.Parameters.Add(pa);
                }
                for (int i = 0; i < sql.Length; i++)
                {
                    cmd.CommandText = sql[i];
                    da.SelectCommand = cmd;
                    if (tablename != null)
                        da.Fill(ds, tablename);
                    else
                        da.Fill(ds, "table" + i.ToString());
                }
                da.Dispose();
                return ds;
            }
    "select top 4 * from by_file where middleid in(select middleid from by_middle where middlename=@key ) and  elite=True order by SubmitDate desc"
    @key 給進去一切正常哦!
      

  29.   

    OLEDB能用@吗?
    我一般都用?
      

  30.   

    OLEDB能用@吗?
    我一般都用?可以用.-----难免有错,错了莫怪.
      

  31.   

    以前的你说正常,那用的存储过程吧.msdn上很清楚了.
    msdn 2003:
    ------------
    如果 CommandType 设置为 Text,OLE DB .NET 提供程序不支持将参数传递给 OleDbCommand 调用的 SQL 语句或存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如:SELECT * FROM Customers WHERE CustomerID = ?因此,向 OleDbParameterCollection 添加 OleDbParameter 对象的顺序必须直接对应于该参数的问号占位符在命令文本中的位置。
    ------------
    msdn 2005:
    -----------
    如果 CommandType 设置为 Text,OLE DB .NET 提供程序不支持将参数传递给 OleDbCommand 调用的 SQL 语句或存储过程的命名参数。在这种情况下,必须使用问号 (?) 占位符。例如: SELECT * FROM Customers WHERE CustomerID = ? 因此,OleDbParameter 对象添加到 OleDbParameterCollection 的顺序必须直接对应于命令文本中参数的问号占位符的位置。
    -----------
      

  32.   

    奇怪,我最近用DAAB做了一个PDF。NET 数据处理框架,访问ACCESS就是用的@参数方式,怎么没有出一点错误?
      

  33.   

    OleDb方式,没试过用"@",都用"?"的..
      

  34.   

    正确的说很多OleDb驱动不支持参数名,只支持参数顺序!
    update [xxxx] set aa=?,bb=?,cc=?
    增加参数时只按顺序不按名称
      

  35.   

    我用的OleDb,存储过程带参数@是行的,Text没试过。不过Text可以这样呀:"Select * from Table Where Parameter = '"+@Parameter+"'" 。