【发布时间】:2014-11-03 15:49:00
【问题描述】:
我正在从 c# 以本地化语言(波斯语)传递 sqlparameter,但没有检索到行。数据库已经为 persioan_100_ci_ai 整理,表是整理 database_default
SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
SqlDataReader dr = default(SqlDataReader);
dt.TableName = "temp";
try {
if (!(conn.State == ConnectionState.Closed))
conn.Close();
if (conn.State == ConnectionState.Closed)
conn.Open();
cmd.Connection = conn;
string qry = "Select * from users WHERE [Name]=@UserName AND [Pwd]=@Password";
cmd.commandtext = qry;
cmd.Parameters.Add("@UserName", SqlDbType.NVarChar, 50).Value = "ادمین";
cmd.Parameters.Add("@Password", SqlDbType.NVarChar, 50).Value = "ادمین";
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (dr.HasRows) {
dt.Load(dr);
}
return dt;
} catch (Exception ex) {
return null;
} finally {
dt = null;
cmd.Connection = null;
cmd.Parameters.Clear();
cmd.Dispose();
}
它适用于 SSMS
declare @UserName nvarchar(50) = 'ادمين'
declare @Password nvarchar(50)= 'ادمين'
select * from Users where [name]=@UserName and [Pwd] = @Password
当我在查询中嵌入变量而不是参数时,它甚至可以工作
SqlCommand cmd = new SqlCommand();
DataTable dt = new DataTable();
SqlDataReader dr = default(SqlDataReader);
string pLoginName = "ادمین";
string pPassword = "ادمین";
dt.TableName = "temp";
try {
if (!(conn.State == ConnectionState.Closed))
conn.Close();
if (conn.State == ConnectionState.Closed)
conn.Open();
cmd.Connection = conn;
string qry = "Select * from users WHERE [Name]='" + pLoginName + "' AND [Pwd]='" + pPassword + "'";
cmd.CommandText = qry;
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
if (dr.HasRows) {
dt.Load(dr);
}
return dt;
} catch (Exception ex) {
return null;
} finally {
dt = null;
cmd.Connection = null;
cmd.Parameters.Clear();
cmd.Dispose();
}
无法弄清楚我错在哪里。 请哪位大神指点一下。
【问题讨论】:
-
使用cmd.Parameters.AddWithValue,有什么区别吗?
-
@HamidP:不要使用
AddWithValue!查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue()- 它可能会导致意想不到和令人惊讶的结果... -
你是对的 marc - 这里我们用类型声明参数。所以内部库无法确定您传递的参数值的类型。特别是当参数必须为“Nvarchar”时,因为它使用 unicode
-
仍然尝试了 AddWithValue 但结果相同 dr.hasrows = false。
标签: c# asp.net sql-server tsql ado.net