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

C# SQL Server日期格式不适用于存储过程,c#,sql,sql-server,date,stored-procedures,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 SqlConnectio

我有一个存储过程来更新表中的一行。 我使用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;
}
尽管字符串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语句中用单引号括住参数那样简单吗

编辑:这是原始存储过程(应该在之前发布)

编辑:我在尝试什么 我从ManagementStudio中执行存储过程

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

味精102,第15级,状态1,第8行
“-”附近的语法不正确


SQL和MSSQL Management Studio中的日期文字需要用单引号括起来,除非使用了特定的整数日期格式(此处不是这种情况)

至于哪种格式有效。。。这将取决于托管数据库的计算机上的区域设置。通常有几种不同的格式可以工作
'yyyy-MM-dd'
通常是这样,被广泛使用,从您发布的信息来看,它似乎也适用于您的环境

在T-SQL中,将
varchar
中的日期转换为日期/时间类型之一的最安全方法是尽可能使用该函数,而不是将转换留给数据库

但是,在通过<代码> SqLCOMPULTIONS参数>代码>集合时,不需要考虑单引号。当您选择正确的
SqlDbType
时,将为您处理报价。如果您知道日期是一种特定的格式,那么您应该解析date参数并像这样传递它

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


如果您没有以特定的格式解析日期,那么您将把它留给C#或数据库,以便根据本地计算机的区域设置有效地猜测格式,这可能会导致代码在不同环境中运行时出现问题。

我看到的问题是存储过程
@festDatum date中的数据类型,
它是日期,在您的C#code
(“@festDatum”,Convert.ToDateTime(festDatum)
中,您正在将其转换为日期时间

请尝试将存储过程中的参数类型从date转换为datetime

使用festDatum.toSortDateString()作为c代码中的值


请让我知道它是否有效。

您说“存储过程不接受它”。介意解释一下这到底意味着什么吗?至于在SSMS中执行SQL,您需要在SSMS中使用日期文字。
2013-07-01
不是日期文字。请改为使用
'2013-07-01'
。这不是参数化版本的问题(带日期)。这假设您正在使用查询窗口运行查询。将
Convert.ToDateTime(festDatum)
是否真的为您提供了类型为
DateTime
的有效对象?存储过程的
@FestDataum
@FestEindDatum
参数的类型是什么?我怀疑存储过程可能接收字符串参数并将其转换为代码中的日期。这看起来像是SSMS问题。这与此无关h存储过程或您的C#。不确定它需要什么格式,但您可以尝试以下所有操作:
'2013-07-01'
01-Jul-2013
\2013-07-01#
。这是SSMS试图将字符串转换为日期,但失败了。您确定吗?在原始帖子中我已经说过:尽管字符串的格式正确rmat(yyyy-MM-dd)…刚刚测试了它,仍然是相同的错误消息。我不认为问题出在c上,但是存储过程本身,谢谢,我已经尝试过了,没有任何效果。但是我只是将它转换为nvarchar,它总是接受。毕竟,正确的日期格式是用c格式化的,然后发送到sp
sqlCommand.Parameters.Add("@festDatum", SqlDbType.Date).Value = 
                          DateTime.ParseExact(festDatum, "yyyy-MM-dd", 
                                              CultureInfo.InvariantCulture);