2014-11-03 50 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