大家注意,这绝对不是一个很低级的问题,请慎重发言: ^^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'。]
...................
解决方案 »
- ie兼容的问题
- 足够宽
- 提供程序无法确定 Object 值
- 脚本中怎么把文本框的值强转为INT类型
- 请教:我想让dropdownlist每次选择一项之后都回调进行查询,但是现在只是onchange改变之后才会回调(因为有个查询参数不同,但是下拉菜单中得
- FreeTextBox 3.1.6的问题
- 求救:有关IE Web Control的Treeview问题!
- 求助!asp.net mvc3做的项目在本地iis7上运行正常,可是在windows server 2003 的iis6上ajax不能用了!
- 网站发布到服务器后,程序一出错,网站就崩了
- 此项目的默认web访问模式设置为文件共享, 但是无法从路径"\\IBM-TZAALERMB80\wwwroot$\WebApplication1"打开“http://localhost/WebAppl
- 怎样在javascript中写入cookie 然后在asp.net中调用?
- 现在用.net做b/s的,ajax用得多吗?
OleDbCommand cmd = new OleDbCommand(
@"SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserID", m_conn );
PUserID.Value = strUserID.Trim();
cmd.Parameters.Add(PUserID);这样可以么?
OleDbCommand cmd = new OleDbCommand("SELECT COUNT(1) FROM [T_USER] WHERE CardID = @strUserID", m_conn );
您以前一直用@id方式声明变量,数据源是oledb还是sql呢
如果连接oledb是不是oledb不支持@id命名方式,而尽支持?命名方式
sql不支持?命名方式而今支持@id命名方式小弟冒昧,浅薄无知,受教了。
{
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;
}
{
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;
}
而且根据特定条件的不同,所使用的参数的次数也不同。所以,我对显式命名参数有需求。
回楼上几个朋友:
我用的是vs.net 2003数据库是SQL Server这种搭配方式使用了2年多都没有出现过问题 >_<
写成这样也不行,还是那个错误
===================================================================================
System.Data.OleDb.OleDbParameter PUserID = new OleDbParameter("@strUserID", System.Data.OleDb.OleDbType.VarChar,50);
PUserID.Value = strUserID.Trim();
cmd.Parameters.Add(PUserID);
参数的问题应该和数据库没有关系吧
如果你确定你的程序中别的地方可以使用 @参数 形式写查询参数,只是这个地方不行,可以改成更可靠的写法: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;
}
大家要是觉得我的连接字符串写的有问题,
不妨给贴出两个自己平时使用的。
———————————————————————————————————————————
其实不论是 SqlCommand 还是 OracleCommand,都是从 DbCommand 继承的。对于Parameters、DbConnection等也是如此。你直接使用ADO.NET一般化类来达到兼容的目的,在换数据库的时候换一条 DbFactory 创建命令或者是 DbConnection创建命令。使用System.Data.SqlClient和System.Data.OracleClient,而不应该使用 OleDB。
小弟认为要去掉“@”="SELECT COUNT(1) FROM T_USER WHERE CardID = @strUserId"这样我想是可以的,我一直都是这样的。献丑了。
adp.ParameterName = "@strUserID";
adp.Value = strUserID.Trim();;
cmd.Parameters.Add(adp);这种方法根本就不行,上面已经有一个朋友这么讲过了,我也早就回复说不能用了....
而是如何使用正确使用OleDB
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();
OleDb 操作Access2000數據庫
也用@ID參數來的,為什麼沒有出錯啊????
{
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 給進去一切正常哦!
我一般都用?
我一般都用?可以用.-----难免有错,错了莫怪.
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 的顺序必须直接对应于命令文本中参数的问号占位符的位置。
-----------
update [xxxx] set aa=?,bb=?,cc=?
增加参数时只按顺序不按名称