2013-05-11 43 views
0

我有一個存儲過程更新表中的一行。 我使用C#到所有的參數傳遞到這樣的存儲過程:SQL Server日期格式不適用於存儲過程

public int editFestival(String festId, String festNaam, String festLocatie, String festDatum, 
         String festDuur, String festEindDatum, String festUrl) 
{ 
sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["project"].ConnectionString); 
sqlCommand = new SqlCommand("EditFestival", sqlConnection); 
sqlCommand.CommandType = CommandType.StoredProcedure; 

sqlCommand.Parameters.Add(new SqlParameter("@festId", Convert.ToInt32(festId))); 
sqlCommand.Parameters.Add(new SqlParameter("@festNaam", festNaam)); 
sqlCommand.Parameters.Add(new SqlParameter("@festLocatie", festLocatie)); 
sqlCommand.Parameters.Add(new SqlParameter("@festDatum", Convert.ToDateTime(festDatum))); 
           //Also tried ->  , SqlDbType.date)).Value = festDatum 
sqlCommand.Parameters.Add(new SqlParameter("@festDuur", Convert.ToInt32(festDuur))); 
sqlCommand.Parameters.Add(new SqlParameter("@festEindDatum", Convert.ToDateTime(festEindDatum))); 
sqlCommand.Parameters.Add(new SqlParameter("@festUrl", festUrl)); 

sqlConnection.Open(); 
sqlTransaction = sqlConnection.BeginTransaction(); 
sqlCommand.Transaction = sqlTransaction; 
rows = sqlCommand.ExecuteNonQuery(); 
sqlTransaction.Commit(); 
return rows; 
} 

雖然字符串festDatum(這意味着festDate英文)處於正確的格式(YYYY-MM-DD)它不是被存儲過程接受。

當我用我自己給變量執行存儲過程,這是它產生:

USE [groep2_festivals] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[EditFestival] 
     @festId = 1, 
     @festNaam = N'Rock Werchter', 
     @festLocatie = N'Werchter - Belge', 
     @festDatum = 2013-07-01, --This is where it says that there's a syntax error near '-' 
     @festDuur = 4, 
     @festEindDatum = 2013-07-04, 
     @festUrl = N'www.rockwerchter.be' 

SELECT 'Return Value' = @return_value 

GO 

當我手動環繞單引號兩個日期,它工作正常。 我在做什麼錯?或者它會像用單引號圍繞更新語句中的參數一樣簡單?

編輯:這是原來的存儲過程(應該已經張貼了這個更早)

USE [groep2_festivals] 
GO 
/****** Object: StoredProcedure [dbo].[EditFestival] Script Date: 10/05/2013 12:44:49 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author: Robbie Vercammen 
-- Create date: 10/05/2013 
-- Description: Veranderd de gegevens van een bepaald festival 
-- ============================================= 

CREATE PROCEDURE [dbo].[EditFestival] 
    (
    @festId int, 
    @festNaam nvarchar(255), 
    @festLocatie nvarchar(255), 
    @festDatum date, 
    @festDuur int, 
    @festEindDatum date, 
    @festUrl nvarchar(255) 
    ) 
AS 
BEGIN 
SET NOCOUNT ON; 
UPDATE festivals 
SET fest_naam = @festNaam, fest_locatie = @festLocatie, fest_datum = @festDatum, 
    fest_duur = @festDuur, fest_einddatum = @festEindDatum, fest_url = @festUrl 
WHERE fest_id = @festid 
END 

編輯:我試圖 我從Management Studio中執行存儲過程

entering parameters here

生成的代碼已在上面發佈;) 執行時,它只是說

Msg 102,Level 15,State 1,Line 8
「 - 」附近的語法不正確。

+0

你說 - 「它不被存儲過程接受」。介意解釋到底是什麼意思? – Oded 2013-05-11 20:11:15

+4

至於在SSMS中執行SQL - 您需要在SSMS中使用日期文字。 '2013-07-01'不是日期文字。改用「2013-07-01」。這不是參數化版本(帶日期)的問題。這假定您正在使用查詢窗口來運行查詢。 – Oded 2013-05-11 20:12:34

+0

'Convert.ToDateTime(festDatum)'真的會給你一個類型爲'DateTime'的有效對象嗎? – Corak 2013-05-11 20:13:56

回答

1

除非使用特定的整數日期格式,否則SQL和MSSQL Management Studio中的日期文字必須用單引號引起來,這裏不是這種情況。

至於哪種格式可以工作......它將取決於託管數據庫的計算機上的區域設置。通常有幾種不同的格式可以工作。 'yyyy-MM-dd'通常會這樣做,被廣泛使用,並且您發佈的信息似乎也適用於您的環境。

在T-SQL,在一個varchar轉換日期的日期/時間類型的一個最安全的方法就是可以使用CONVERT()功能,而不是離開轉換到數據庫中。

但在C#中,通過SqlCommand.Parameters集合傳遞參數時不需要考慮單引號。當您選擇正確的SqlDbType時,引用將被照顧。如果您知道日期是在一個特定的格式,那麼你應該解析日期參數,並把它傳遞這樣的...

sqlCommand.Parameters.Add("@festDatum", SqlDbType.Date).Value = 
          DateTime.ParseExact(festDatum, "yyyy-MM-dd", 
               CultureInfo.InvariantCulture); 
festEindDatum

與相同。

如果您不以特定格式解析日期,那麼您將它留給C#或數據庫以根據本地計算機的區域設置有效猜測格式,這可能會導致您的代碼在運行時出現問題一個不同的環境。

+0

確定嗎?在原帖中我已經說過了:儘管String festDatum的格式是正確的(yyyy-MM-dd)... – DerpyNerd 2013-05-11 20:20:53

+0

剛剛測試過,仍然是同樣的錯誤信息。我認爲問題不在於c#,而是存儲過程本身 – DerpyNerd 2013-05-11 20:23:08

+0

好的,然後發佈SP代碼。 – davmos 2013-05-11 20:25:23

0

我看到的問題是在這日期存儲過程@festDatum date,和C#代碼("@festDatum", Convert.ToDateTime(festDatum)你將其轉換爲日期時間的數據類型。

請嘗試從日期在存儲procdeure轉換參數類型日期時間

或者使用festDatum.ToShortDateString()在C#代碼值。

請讓我知道它是否有效。

+0

嗨,謝謝,我已經嘗試過,沒有任何工作對我來說。但我只是將它轉換爲nvarchar,它總是接受。畢竟,正確的日期格式是用c#格式化的,然後發送給sp – DerpyNerd 2013-05-14 11:53:36