在Excel中编写VSTO插件(使用C#(时,我试图使用OLEDB从SQL数据库中检索值。当我调试此函数时,它在catch
上失败。
我得到的信息是:
必须声明标量变量"@uname";
但我在绑定参数时已经这样做了。我做错了什么?
public static int getUserID(string username)
{
int result = 0;
string sql = @"select top 1 [ID] FROM " + tbl_users + " WHERE ( [UNAME]=@uname );";
Console.WriteLine("sql: " + sql);
using (OleDbConnection conn = new OleDbConnection(connStr))
{
try
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@uname", username);
result = (int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
result = -15;
}
finally
{
conn.Close();
conn.Dispose();
}
}
return result;
}
所以我想我明白了。。。这个改变是有效的,但我真的不喜欢。
首先,我需要使用OleDb参数绑定,而不是SqlParameter绑定。
OleDb似乎也不喜欢像@uname
这样的自定义命名参数,而是依赖于参数的顺序(我不喜欢这样(。因此,如果有人感兴趣,这里有一个解决方案:
public static int getUserID(string username)
{
int result = 0;
string sql = @"select top 1 [ID] FROM " + tbl_users + " WHERE ( [UNAME]=? );";
Console.WriteLine("sql: " + sql);
using (OleDbConnection conn = new OleDbConnection(connStr))
{
try
{
conn.Open();
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.Parameters.Add("?", OleDbType.VarChar).Value = Convert.ToString(username);
result = (int)cmd.ExecuteScalar();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
result = -15;
}
finally
{
conn.Close();
conn.Dispose();
}
}
return result;
}