C# 错误:从字符串.NET SQL Server转换日期时间时,转换失败
我意识到以前有人问过这个问题,但是在检查了之前回答的问题之后,我仍然不能完全理解这个代码的错误 仅供参考,我在英国C# 错误:从字符串.NET SQL Server转换日期时间时,转换失败,c#,.net,sql,sql-server,C#,.net,Sql,Sql Server,我意识到以前有人问过这个问题,但是在检查了之前回答的问题之后,我仍然不能完全理解这个代码的错误 仅供参考,我在英国 public static void GetDataForCSEP(string viewName, string schemaName, string dateFieldName, DateTime startDate, DateTime endDate) {
public static void GetDataForCSEP(string viewName, string schemaName,
string dateFieldName, DateTime startDate, DateTime endDate)
{
string dateFormat = "yyyy/MM/dd HH:mm:ss";
//Connect to SQl Server
string commandText = "SELECT * FROM " + schemaName + "." + viewName + " WHERE @dateFieldName BETWEEN @startDate AND @endDate";
using (SqlCommand sqlCmd = new SqlCommand(commandText,sql_Conn))
{
sqlCmd.CommandType = CommandType.Text;
sqlCmd.Parameters.Add("@dateFieldName",SqlDbType.NVarChar, 30).Value = dateFieldName;
sqlCmd.Parameters.Add("@startDate", SqlDbType.DateTime).Value = DateTime.Parse(startDate.ToString(dateFormat));
sqlCmd.Parameters.Add("@endDate", SqlDbType.DateTime).Value = DateTime.Parse(startDate.ToString(dateFormat));
sql_Conn.Open();
sqlCmd.ExecuteNonQuery();
}
}
这将取决于您的SQL Server语言环境设置,但可能
string dateFormat = "dd-MMM-yyyy HH:mm:ss";
是否适用于您?错误是您无法将列名作为参数传递
"SELECT * FROM " + schemaName + "." + viewName + "
WHERE @dateFieldName BETWEEN @startDate AND @endDate";
这应该是
"SELECT * FROM " + schemaName + "." + viewName + "
WHERE " + dateFieldName + " BETWEEN @startDate AND @endDate";
为了避免sqlInjection攻击,请使用
Sp_executeSQL
执行此类查询,因为这是动态sql查询。谢谢,我如何找到这些设置?它是特定于登录的,不是吗?是和否-将有默认值,但您也可以在用户连接期间修改它们,等等。我会在线查看书籍,因为我对DBA方面不太熟悉!你到底为什么要做DateTime.Parse(startDate.ToString(dateFormat))
-startDate
已经是一个DateTime值了。为什么要把它转换成字符串,只是为了把它转换回来呢?因为我是一个垃圾程序员:)同意,按照结构,代码将尝试检查静态字符串@dateFieldName
是否在两个日期之间。为此,SQL引擎正在尝试将@dateFieldName
的文本值转换为日期,但失败。