2016-06-15 87 views
2

我得到一些意外的錯誤, 我有兩個兩種方法之一是的insertUpdate &另一個GETDATA過程或函數預計參數「@OperatorName」,但未提供

for INSERT UPDATE SP is -- >> spInsert_WorkEntry 
for GETDATA SP is  -- >> spGetWorkEntryData 

兩者的SP參數與圖像中顯示的相同。

我正在動態生成參數。如CreateParams所示。 創建參數對於INSERTUPDATE & GETDATA的兩種方法都是相同的。

插入更新方法正常工作&按預期工作。

但是,當我試圖執行另一種方法,即GETDATA它給我錯誤@OperatorName參數預計。 第一個參數是@AutoID該參數沒有給出錯誤。 我檢查了所有可能會導致問題的可能情況,但現在可以獲得任何信息。

public int InsertOrUpdate(WorkEntry t, string callingPage, string operation) 
{ // Start the Insert Update Method 
    IDbDataParameter[] param = null; 
    int returnValue = 0; 
    try 
    { 
     param = CreateParams(t, callingPage, operation); 
     param[0].Value = t.AutoID; 
     param[1].Value = t.OperatorName; 
     param[2].Value = t.Date; 
     param[3].Value = t.StartDate; 
     param[4].Value = t.EndDate; 

     SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString()); 
     sqlConnection.Open(); 
     SqlCommand command = sqlConnection.CreateCommand(); 
     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.CommandText = "spInsert_WorkEntry"; 
     command.Parameters.AddRange(param); 

     returnValue = command.ExecuteNonQuery(); 
     sqlConnection.Close(); 
     return returnValue; 

    } 
    catch (Exception ex) 
    { 
     return returnValue; 
     throw ex; 
    } 
    finally 
    { 
     param = null; 
    } 
}// End the Insert Update Method 
// Get----------------------------------------------------------------------------------------- 
public DataSet Get(WorkEntry t, string callingPage, string operation) 
{ // Start the Insert Update Method 
    IDbDataParameter[] param = null; 
    DataSet returnValue = new DataSet(); 
    try 
    { 
     param = CreateParams(t, callingPage, operation); 
     param[0].Value = t.AutoID; 
     param[1].Value = t.OperatorName; 
     param[2].Value = t.Date; 
     param[3].Value = t.StartDate; 
     param[4].Value = t.EndDate; 

     SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString()); 
     sqlConnection.Open(); 
     SqlCommand command = sqlConnection.CreateCommand(); 
     SqlDataAdapter da = new SqlDataAdapter(command); 
     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.CommandText = "spGetWorkEntryData"; 
     command.Parameters.AddRange(param); 
     da.Fill(ds); 

     sqlConnection.Close(); 
     return returnValue; 

    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
    finally 
    { 
     param = null; 
     command.Parameters.Clear(); 

    } 
}// End the Insert Update Method 
// Get End ----------------------------------------------------------------------------------------- 
public IDbDataParameter[] CreateParams(WorkEntry workEntry, string CallingPage, string Operation) 
{ 
    IDbDataParameter[] param = new IDbDataParameter[5]; 

    param[0] = new SqlParameter(); 
    param[0].DbType = DbType.Int32; 
    param[0].Size = 50; 
    param[0].ParameterName = "@AutoID"; 
    param[0].Direction = ParameterDirection.Input; 

    param[1] = new SqlParameter(); 
    param[1].DbType = DbType.String; 
    param[1].Size = 50; 
    param[1].ParameterName = "@OperatorName"; 
    param[1].Direction = ParameterDirection.Input; 

    param[2] = new SqlParameter(); 
    param[2].DbType = DbType.DateTime; 
    param[2].Size = 50; 
    param[2].ParameterName = "@Date"; 
    param[2].Direction = ParameterDirection.Input; 

    param[3] = new SqlParameter(); 
    param[3].DbType = DbType.DateTime; 
    param[3].Size = 50; 
    param[3].ParameterName = "@StartDate"; 
    param[3].Direction = ParameterDirection.Input; 

    param[4] = new SqlParameter(); 
    param[4].DbType = DbType.DateTime; 
    param[4].Size = 50; 
    param[4].ParameterName = "@EndDate"; 
    param[4].Direction = ParameterDirection.Input; 
    return param; 
} 

下面是SP的圖像

GetData SP

Insert SP

+2

這很可能不會解決您的問題,但'DbType.String'應該用於Unicode字符串(即對於'nchar'和'nvarchar'),'varchar'應該使用'DbType.AnsiString'。同樣在C#代碼中,您的大小設置爲50,其中您的過程大小爲100. – dotnetom

+0

我也嘗試了使用chaging數據類型進行測試,然後它也無法正常工作。我已經把它作爲整數來檢查,所以它不起作用 –

+0

爲什麼你要傳遞選擇SP的參數? – KanisXXX

回答

1

嘗試前SqlDataAdapter da = new SqlDataAdapter(command);聲明

SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString()); 
     sqlConnection.Open(); 
     SqlCommand command = sqlConnection.CreateCommand(); 
    command.Parameters.AddRange(param); 
     SqlDataAdapter da = new SqlDataAdapter(command); 
     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.CommandText = "spGetWorkEntryData"; 

     da.Fill(ds); 

也爲select語句移動command.Parameters.AddRange(param);,如果你不使用Where條款,那麼也許傳遞參數是不必要的。

更新:我測試了它和它在我的例子做工精細

我到你Get方法

public DataSet Get(string callingPage, string operation) 
    { // Start the Insert Update Method 

     // new instance of dataset and sqlcommand 
     DataSet ds = new DataSet(); 
     SqlCommand command = new SqlCommand(); 

     IDbDataParameter[] param = null; 
     DataSet returnValue = new DataSet(); 
     try 
     { 
      param = CreateParams(callingPage, operation); 
      param[0].Value = 1; 
      param[1].Value = ""; 
      param[2].Value = DateTime.Now; 
      param[3].Value = DateTime.Now; 
      param[4].Value = DateTime.Now; 

      // using connectin string property insted ConfigurationManager.AppSettings 
      SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["Connection"].ConnectionString); 
      sqlConnection.Open(); 
      command = sqlConnection.CreateCommand(); 
      SqlDataAdapter da = new SqlDataAdapter(command); 
      command.CommandType = System.Data.CommandType.StoredProcedure; 
      command.CommandText = "spGetWorkEntryData"; 
      command.Parameters.AddRange(param); 
      da.Fill(ds); 

      sqlConnection.Close(); 
      return returnValue; 

     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      param = null; 
      command.Parameters.Clear(); 

     } 
    }// End 

我演示存儲過程

Create proc [dbo].[spGetWorkEntryData] 
@autoId int, 
@operatorName varchar(100), 
@date datetime, 
@startDate datetime, 
@enddate datetime 

as 

begin 
select * from dbo.tblBinaryUsers 
end 

做了一些改動結果: enter image description here

+0

沒有解決問題 –

+0

@HardikParmar檢查更新的答案 – KanisXXX

+1

是你的代碼工作我得到了excet的根本原因爲什麼代碼沒有表現得不像預期的那樣。因爲當我們將null值傳遞給參數時,它不會添加我們傳遞存儲過程的參數列表。當我已經傳遞了一些值的參數,它按預期工作。感謝您的時間和幫助。我感謝您的幫助。 –

0

取下選擇查詢SP spGetWorkEntryData所有參數,它並不需要這個, 和你的SP將是

create proc spGetWorkEntryData 
as 
begin 
select operatorname, date, startdate ,enddate from workentry 
end 
+0

沒有解決問題 –

+0

什麼是新的錯誤引發,還檢查數據庫連接,你使用相同的數據庫。 –

+0

程序或函數期望參數'@OperatorName',這是沒有提供 –

相關問題