2013-06-05 54 views
1

我有這張表具有user_Id和regNo字段的配置文件,並且我希望先檢查ID和電子郵件是否已存在,然後再繼續插入數據。在我的代碼中,我只能驗證一行(id或reg number),但是如果我要驗證它們中的兩個,它會給我一個錯誤,說「必須聲明標量變量@用戶名」。我不知道它是否與我的選擇是錯誤的或我的代碼中的東西。檢查ID和REG是否已經存在

SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"); 
    con.Open(); 
    SqlCommand cmdd = new SqlCommand("select * from Profile where user_Id = @userid AND RegNo = @reg", con); 

    SqlParameter param = new SqlParameter(); 
    //SqlParameter param1 = new SqlParameter(); 
    param.ParameterName = "@userid"; 
    param.ParameterName = "@reg"; 

    param.Value = txtid.Text; 
    param.Value = txtregNo.Text; 

    cmdd.Parameters.Add(param); 
    //cmdd.Parameters.Add(param1); 


    SqlDataReader reader = cmdd.ExecuteReader(); 


     if (reader.HasRows) 
     { 
      MessageBox("User Id/Registry Number already exists"); 
     } 


     else 
     { 
      SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"); 
      SqlCommand cmd = new SqlCommand("qry", con); 
      cmd.CommandType = System.Data.CommandType.Text; 

      cmd.Parameters.AddWithValue("@id", txtid.Text); 
      cmd.Parameters.AddWithValue("@regno", txtregNo.Text); 
      cmd.Parameters.AddWithValue("@name", txtname.Text); 

      cmd.CommandType = System.Data.CommandType.StoredProcedure; 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      MessageBox("successfully saved!"); 

     } 

我正在使用C#與asp.net。

回答

1
param.ParameterName = "@userid"; 
param.ParameterName = "@reg"; 

param.Value = txtid.Text; 
param.Value = txtregNo.Text; 

你只申報1個參數,它覆蓋兩個ParameterNameValue。另外,您應該考慮查看某種類型的數據訪問幫助程序或ORM或其他類型,以便爲您節省所有樣板SQL連接代碼的麻煩。

您還在應該已經是開放式SQL連接的內部打開另一個連接。

0

根據錯誤的問題是,將參數分配給@userid後,您將重新分配參數到@reg

試試這個:

SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True"); 
con.Open(); 
SqlCommand cmdd = new SqlCommand("select user_id from Profile where user_Id = @userid AND RegNo = @reg", con); 


cmdd.Parameters.AddWithValue("@userid", txtid.Text); 
cmdd.Parameters.AddWithValue("@reg", txtregNo.Text); 

var id = cmdd.ExecuteReader() as string; 

if (String.IsNullOrEmpty(id)) 
{ 
    //Show error message and exit the method 
} 
else 
{ 
    //Add the row to the database if it didn't exist 
} 

編輯:

我添加了一些代碼來顯示,如果在表中存在的用戶id,你可以怎麼查。然後你檢查用戶標識本身,而不是檢查reader對象。請注意,我現在不在我的開發計算機上,所以我沒有編譯這個,你可能需要做一些調整,但這個想法就在那裏。

+0

您好,感謝您的回覆。我試過你的代碼建議。但它只是驗證註冊號,用戶標識未驗證,即使存儲ID也已存在 – user2388316

+0

將'id'設置爲表中的主鍵? –

+0

不,我的主鍵不是我的主鍵 – user2388316

0

您正在使用一個sql參數實例並將其傳遞給兩個不同的值,從而覆蓋第一個值。試着這樣說:

SqlParameter param1 = new SqlParameter("@userid", txtid.Text); 

SqlParameter param2 = new SqlParameter("@reg", txtregNo.Text); 
+0

我也試過你的代碼建議。但它只是驗證登記號,用戶ID沒有驗證,它正在保存,即使ID已經存在 – user2388316

+0

我的帖子是關於你的第一個錯誤的參數。如果由於某種原因,您不希望在數據庫的這兩個字段上添加唯一索引,您可以始終在配置文件中執行'select count(1),其中user_Id = @userid AND RegNo = @ reg' '那麼用戶已經存在其他明智的你可以繼續使用插入 – Ted

+0

你可以使用另一個'SqlCommand'和'ExecuteReader()'或一個'SqlDataAdapter'和'DataSet'。檢查這個CodeProject出來http://www.codeproject.com/Articles/4416/Beginners-guide-to-accessing-SQL-Server-through-C – Ted

2

OK,所以這是行不通的:

SqlParameter param = new SqlParameter(); 
//SqlParameter param1 = new SqlParameter(); 
param.ParameterName = "@userid"; 
param.ParameterName = "@reg"; 

param.Value = txtid.Text; 
param.Value = txtregNo.Text; 

cmdd.Parameters.Add(param); 

因爲你重新分配相同對象的值。改變這樣:

cmdd.Parameters.AddWithValue("@userid", txtid.Text); 
cmdd.Parameters.AddWithValue("@reg", txtregNo.Text); 

這將參數,他們兩個,增加了SqlCommand對象。 現在,多一點建議,可以考慮這樣做:

using (SqlConnection con = new SqlConnection("Data Source=GATE-PC\\SQLEXPRESS;Initial Catalog=dbProfile;Integrated Security=True")) 
{ 
    con.Open(); 
    using (SqlCommand cmdd = new SqlCommand("select * from Profile where user_Id = @userid AND RegNo = @reg", con)) 
    { 
     ... 

     using (SqlDataReader reader = cmdd.ExecuteReader()) 
     { 
      ... 
     } 
    } 
} 

因爲現在你沒有配置這些對象正確。

你看,任何實現IDisposable應該被包裹在一個using聲明確保Dispose方法被調用就可以了。

相關問題