2014-11-03 51 views
0

我从本地化语言(波斯语)传递sqlparameter从C#但没有行检索。数据库已经整理了persioan_100_ci_ai和表格整理database_defaultc#ado.net sqlparameter失败

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][email protected] AND [Pwd][email protected]"; 
    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][email protected] 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(); 
} 

想不通嵌入变量工作在哪里我错了。 请有任何人指出。

+0

使用cmd.Parameters.AddWithValue,有什么区别? – dotctor 2014-11-03 15:55:56

+0

@HamidP:**不要**使用“AddWithValue”!看看[我们可以停止使用AddWithValue()了吗?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)并停止使用'.AddWithValue()' - 它可能会导致意外的和令人惊讶的结果... – 2014-11-03 19:57:06

+0

你是正确的marc - 在这里我们声明参数类型。所以内部库不能确定你传递的参数值的类型。具体来说,当参数必须是“Nvarchar”时,因为它使用unicode – 2014-11-05 04:18:58

回答

0

尝试使用此:

cmd.Parameters.Add(new SqlParameter("@Password", "ادمین")); 

编辑:

让我们尝试用不同的方式。如果你想要进行一些重新编码。我会从一个可以工作的旧大学项目中发布一个例子。它基本上是一样的概念。可能不是最好的方式,但它的工作原理...

我在.aspx页面上使用了DataAdapter,DataSet和GridView控件。你标记了ASP.net,但我不确定你想用什么来显示数据。

string selectsql2 = "SELECT * FROM [dbo].Event_View WHERE (EventName LIKE '%' + @EventName + '%')"; 
SqlConnection connect2 = new SqlConnection(connectionstring2); 
SqlCommand cmd = new SqlCommand(selectsql2, connect2); 
SqlParameter pm = new SqlParameter("@EventName", txtEvents.Text); 
cmd.Parameters.Add(pm); 
SqlDataAdapter adapter = new SqlDataAdapter(cmd); 
DataSet ds2 = new DataSet(); 
adapter.Fill(ds2); 
gvEvents.DataSource = ds2; 
gvEvents.DataBind(); 
+0

你应该看看[我们可以停止使用AddWithValue()了吗?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)并停止使用'.AddWithValue()' - 它可能会导致意外和令人惊讶的结果... – 2014-11-03 19:57:53

+0

尝试相同但结果相同dr.hasrows = false。 – 2014-11-05 04:38:55

+0

仍尝试了AddWithValue,但结果相同dr.hasrows = false – 2014-11-05 04:39:59

0

我没有任何问题,我将两个值都添加到我的测试数据库中。下面是示例代码

 // Code in BO logic method 
     string email = "ادمین"; 
     string password = "ادمین"; 


     SqlCommand cmd = new SqlCommand(@"SELECT * FROM Register WHERE [email protected] AND Deleted=0 AND [email protected]"); 

     cmd.Parameters.AddWithValue(@"Email", email.Trim()); 
     cmd.Parameters.AddWithValue(@"Pass", password.Trim()); 

     DataSet dst = Varmebaronen.AppCode.DA.SqlManager.GetDataSet(cmd); 

    //DataAccess Methods ! 
    public static DataSet GetDataSet(SqlCommand cmd) 
    { 
     return GetDataSet(cmd, "Table"); 
    } 

    public static DataSet GetDataSet(SqlCommand cmd, string defaultTable) 
    { 
     SqlConnection conn = GetSqlConnection(cmd); 

     try 
     { 
      DataSet resultDst = new DataSet(); 

      using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) 
      { 
       adapter.Fill(resultDst, defaultTable); 
      } 

      return resultDst; 
     } 
     catch 
     { 
      throw; 
     } 
     finally 
     { 
      conn.Close(); 
     } 
    } 

DataSet有一个记录,尝试使用AddWithValue。如果再次没有发生问题不在参数中!

P.S不要使用一个静态连接,应用程序池是你的朋友

+0

你应该看看[我们可以停止使用AddWithValue()了吗?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)并停止使用'.AddWithValue()' - 它可能会导致意外的和令人惊讶的结果... – 2014-11-03 19:57:31

+0

尝试了AddWithValue,但结果相同dr.hasrows = false。 – 2014-11-05 04:38:35

0

尝试进行分隔条件的参数和值分配如下图所示:

​​
+0

尝试了相同的结果dr.hasrows = false。 – 2014-11-05 04:37:58

+0

你可以试试dr = cmd.ExecuteReader(); – 2014-11-05 09:37:26