2013-05-11 74 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