2011-10-27 32 views
-1

這是我在C#代碼,它說:「沒有數據存在行/列。」,我怎麼能改善這個代碼,使其正常工作?一個文本框輸入相較於SQL查詢

db = new OleDbConnection(); 
db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + fileName; 
db.Open(); 

string sql = "SELECT * FROM GroupNameNS WHERE GroupName = '" + Groupnametxt.Text.Trim() + "'"; 

cmd = new OleDbCommand(sql, db); 
rdr = cmd.ExecuteReader(); 

if (Groupnametxt.Text.Trim() == (string)rdr["GroupName"]) 
{ 
    MessageBox.Show("Group Name taken, please try another name", "Error in Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
    membernumber1.ReadOnly = true; 
} 
else 
{ 
    sql = "INSERT INTO GroupNameNS VALUES ('" + Groupnametxt.Text.Trim() + "')"; 
    membernumber1.ReadOnly = false; 
    cmd = new OleDbCommand(sql, db); 
    rdr = cmd.ExecuteReader(); 
} 
+0

「...或類似的東西」?如果您需要幫助,請給我們確切的錯誤...您是否在查詢Excel電子表格? –

+1

「或者類似的東西」?如果您希望人們幫助您解決錯誤,請至少花時間記錄確切的錯誤消息。此外,它可能是一個好主意,你谷歌的SQL注入攻擊「。 –

+0

請提供更多信息。 「或者類似的東西」並不能幫助我們推斷出問題。你有沒有堆棧跟蹤?您的上述代碼目前也是高度可注入的SQL。您應該考慮使用SqlParameters進行查詢。您不需要檢查Groupnametxt是否與您的DataReader包含的內容相同,因爲查詢已經爲您執行了比較和過濾。 – chemicalNova

回答

0

您需要在您的Reader對象上調用.Read()以便通過結果集的行進行遞增。

rdr.Read(); 

//注意這將返回false,如果沒有要讀取更多的結果,所以它通常用於內部和if陳述或while循環

你可以改變你if (Groupnametxt.Text.Trim() == (string)rdr["GroupName"])if(rdr.Read())因爲如果表中至少有一條記錄具有此GroupName值,則它將返回true。

  if (rdr.Read()) 
      { 
       MessageBox.Show("Group Name taken, please try another name", "Error in Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       membernumber1.ReadOnly = true; 
       rdr.Close(); 
      } 
      else 
      { 
       rdr.Close(); 
       sql = "INSERT INTO GroupNameNS VALUES ('" + Groupnametxt.Text.Trim() + "')"; 
       membernumber1.ReadOnly = false; 
       cmd = new OleDbCommand(sql, db); 
       cmd.ExecuteNonQuery(); 
      } 

我修改了一些其他的東西:不要忘記在使用它之後關閉你的Reader對象。而use ExecuteNonQuery() for an INSERT

+0

易受SQL注入攻擊。應該爲組名使用SQL參數。 –

0

下面是一些額外的改變,以確保與使用關鍵字適當的清理和添加參數的組名作爲最佳實踐。

using(OleDbConnection db = new OleDbConnection()) 
{ 
    db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data source=" + fileName; 
    db.Open(); 

    string groupName = groupName.Text.Trim(); 
    string sql = "SELECT * FROM GroupNameNS WHERE GroupName = '@groupname'"; 

    using(OleDbCommand cmd = new OleDbCommand(sql, db)) 
    { 
     cmd.Parameters.AddWithValue("@groupname", groupName); 

     using(OleDbDataReader rdr = cmd.ExecuteReader()) 
     {  
      if (rdr.Read()) 
      { 
       MessageBox.Show("Group Name taken, please try another name", "Error in Name", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       membernumber1.ReadOnly = true; 
      } 
      else 
      { 
       sql = "INSERT INTO GroupNameNS VALUES ('@groupname')"; 
       cmd.CommandText = sql;    
       cmd.ExecuteNonQuery(); 
       membernumber1.ReadOnly = false;   
      } 
     } 
    } 
}