2017-04-18 70 views
0
String strConnString = ConfigurationManager.ConnectionStrings["CallcenterConnectionString"].ConnectionString; 
SqlConnection con = new SqlConnection(strConnString); 
SqlCommand cmd = new SqlCommand(); 

cmd.Parameters.Add("@CallType", SqlDbType.VarChar).Value = ddlCalltype.SelectedValue.ToString(); 
cmd.Parameters.Add("@Format", SqlDbType.VarChar).Value = ddlFormat.SelectedValue.ToString(); 
cmd.Parameters.Add("@disposition", SqlDbType.VarChar).Value = ddlDisp.SelectedValue.ToString(); 
cmd.Parameters.Add("@SubDisposition", SqlDbType.VarChar).Value = ddlSubdisp.SelectedValue.ToString(); 
cmd = new SqlCommand("UserManagement", con); 
cmd.CommandType = CommandType.StoredProcedure; 
con.Open(); 
cmd.ExecuteNonQuery(); 
con.Close(); 
SqlDataAdapter da = new SqlDataAdapter(); 
DataTable dt = new DataTable(); 

da.SelectCommand = cmd; 
da.Fill(dt); 
gvDetails.DataSource = dt; 
gvDetails.DataBind(); 
gvDetails.Visible = true; 
+1

您正在使用'cmd = new SqlCommand(「UserManagement」,con);''第二次初始化'SqlCommand'的另一個實例,因此現有參數已被刪除。改用'cmd.CommandText =「UserManagement」'(如果需要,我會在幾分鐘內寫一個答案來解決這個問題)。 –

回答

2

此行分配的SqlCommand新實例cmd爲第二時間,而不是使用現有的SqlCommand包含聲明參數,因此去除上面已經聲明的所有參數:

cmd = new SqlCommand("UserManagement", con); 

使用參數化存儲過程管理SqlCommand的正確方法應該是這樣的,使用using語句來管理執行過程中的系統資源(最好的情況下,使用try...catch...finally塊要處理SqlException):

String strConnString = ConfigurationManager.ConnectionStrings["CallcenterConnectionString"].ConnectionString; 
var dt = new DataTable(); 

using (var con = new SqlConnection(strConnString)) 
{ 
    con.Open(); 
    using (var cmd = new SqlCommand("UserManagement", con)) 
    { 
     cmd.Parameters.Add("@CallType", SqlDbType.VarChar).Value = ddlCalltype.SelectedValue.ToString(); 
     cmd.Parameters.Add("@Format", SqlDbType.VarChar).Value = ddlFormat.SelectedValue.ToString(); 
     cmd.Parameters.Add("@disposition", SqlDbType.VarChar).Value = ddlDisp.SelectedValue.ToString(); 
     cmd.Parameters.Add("@SubDisposition", SqlDbType.VarChar).Value = ddlSubdisp.SelectedValue.ToString(); 
     cmd.CommandType = CommandType.StoredProcedure; 

     // using SqlDataAdapter 
     using (var da = new SqlDataAdapter) 
     { 
      da.SelectCommand = cmd; 
      da.Fill(dt); 
     } 

     // using DataTable.Load directly 
     // dt.Load(cmd.ExecuteReader()); 
    } 
    con.Close(); 
} 

// other stuff 

注:總之你可以使用cmd.CommandText = "UserManagement";替代的問題cmd第二次分配,因此它只是提供存儲過程的名稱而是分配另一個SqlCommand實例。而不是ExecuteNonQuery()嘗試使用ExecuteReader()DataTable.Load()方法。

+0

謝謝.....它工作 – user31121992

3

你的代碼是一團糟。對我來說,它看起來像你剛剛使用從其他地方複製和粘貼,並沒有真正理解那裏發生了什麼。

應該是這樣的:

String strConnString = ConfigurationManager.ConnectionStrings["CallcenterConnectionString"].ConnectionString; 
DataTable dt = new DataTable(); 
using(var con = new SqlConnection(strConnString)) 
{ 
    using(var cmd = new SqlCommand("UserManagement", con)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@CallType", SqlDbType.VarChar).Value = ddlCalltype.SelectedValue.ToString(); 
     cmd.Parameters.Add("@Format", SqlDbType.VarChar).Value = ddlFormat.SelectedValue.ToString(); 
     cmd.Parameters.Add("@disposition", SqlDbType.VarChar).Value = ddlDisp.SelectedValue.ToString(); 
     cmd.Parameters.Add("@SubDisposition", SqlDbType.VarChar).Value = ddlSubdisp.SelectedValue.ToString(); 
     using(var da = new SqlDataAdapter()) 
     { 
      da.SelectCommand = cmd; 
      da.Fill(dt); 
     } 
    } 
} 
gvDetails.DataSource = dt; 
gvDetails.DataBind(); 
gvDetails.Visible = true; 
相關問題