Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 错误:从字符串.NET SQL Server转换日期时间时,转换失败_C#_.net_Sql_Sql Server - Fatal编程技术网

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
的文本值转换为日期,但失败。