SQL Server日期格式不适用于存储过程

时间:2013-05-11 20:08:21

标签: c# sql sql-server date stored-procedures

我有一个更新表中行的存储过程。 我正在使用C#将所有参数传递到存储过程中,如下所示:

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;
}

虽然String 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

当我用单引号手动包围两个日期时,它可以正常工作。 我究竟做错了什么?或者它是否就像使用单引号围绕update语句中的参数一样简单?

编辑:这是原始存储过程(应该早先发布)

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
编辑:我在尝试什么 我从管理工作室

中执行存储过程

entering parameters here

生成的代码已在上面发布;) 执行时只是说

  

Msg 102,Level 15,State 1,Line 8
  “ - ”附近的语法不正确。

2 个答案:

答案 0 :(得分: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#或数据库,以根据本地计算机的区域设置有效地猜测格式,这可能会导致代码运行时出现问题不同的环境。

答案 1 :(得分:0)

我看到的问题是存储过程@festDatum date,中的数据类型日期,而在您的C#代码("@festDatum", Convert.ToDateTime(festDatum)中,您将其转换为 datetime

请尝试将存储过程中的参数类型从日期转换为日期时间

使用 festDatum.ToShortDateString()作为c#代码中的值。

如果有效,请告诉我。