0

我的数据库中有一个DateTime以 a 作为参数的存储过程。就我而言,如果我向查询发送一个datetime对象,框架就会发挥作用(哈哈)。

但是,当我运行查询时,出现异常并显示以下错误消息:

将数据类型 nvarchar 转换为日期时间时出错。

我做了一个通用的方法来与数据库通信,我只告诉他存储过程名称和参数。

datetime我从 C# 发送的内容是从配置文件中读取并转换的。

有任何想法吗?

编辑

我将 C# 与 .NET Framework 一起使用,并将 SQL SERVER 2008 用于数据库。

我从配置文件中获取日期,如下所示:

DateTime fechaSistema = Convert.ToDateTime(ConfigurationSettings.AppSettings["fechaSistema"]);

在配置文件中:

  <appSettings>
    <add key ="fechaSistema" value = "2013-05-28"/>
  </appSettings>

执行过程的代码如下所示:

        private static DataTable _retrieveDataTable(string procedure, List<string> args, params object[] values)
    {
        SqlConnection cn = new SqlConnection();
        SqlCommand cm = new SqlCommand();
        SqlDataReader dr;
        DataTable dt = new DataTable();

        try
        {
            conexionSql(cn, cm);
            cm.CommandType = CommandType.StoredProcedure;
            cm.CommandText = "HARDCODERS."+procedure;
            _loadSqlCommand(args, values, cm);
            dr = cm.ExecuteReader();
            dt.Load(dr);
            return dt;
        }
        catch (Exception ex)
        {
            return null;
        }

        finally
        {
            if (cn != null)
            {
                cn.Close();
            }
        }
    }
private static void _loadSqlCommand(List<string> args, object[] values, SqlCommand cm)
{
    for (int i = 0; i < args.Count; i++)
    {
        cm.Parameters.AddWithValue(args[i], values[i].ToString());
    }
}

调用它的方法只是这样做:

SqlConnector.retrieveDataTable("getTop5ClientesConMasPuntosAcumulados", Globals.getFechaSistema());
4

1 回答 1

3

您的问题出在这一行:

private static void _loadSqlCommand(List<string> args, object[] values, SqlCommand cm)
{
    for (int i = 0; i < args.Count; i++)
    {
        // This line:
        cm.Parameters.AddWithValue(args[i], values[i].ToString());
    }
}

您的.ToString()调用强制 .NET 告诉 SQL Server 您发送的参数是一种String类型,而 SQL 无法直接将字符串 ( nvarchar)转换为datetime。如果您删除.ToString()呼叫,它应该按预期工作。

private static void _loadSqlCommand(List<string> args, object[] values, SqlCommand cm)
{
    for (int i = 0; i < args.Count; i++)
    {
        // This should work:
        cm.Parameters.AddWithValue(args[i], values[i]);
    }
}
于 2013-06-02T21:12:41.813 回答