c# - 从字符串转换日期时间时转换失败

标签 c# sql-server-2005 visual-studio-2008

我正在开发C#VS 2008 / SQL Server 2005 Express网站应用程序。我已经尝试过解决此问题的一些方法,但是我的调用堆栈与其他方法有所不同。这些修复程序并不能解决我的问题。我可以采取什么步骤解决此问题?

这是我的错误:

System.Data.SqlClient.SqlException was caught
  Message="Conversion failed when converting datetime from character string."
  Source=".Net SqlClient Data Provider"
  ErrorCode=-2146232060

  LineNumber=10
  Number=241
  Procedure="AppendDataCT"
  Server="\\\\.\\pipe\\772EF469-84F1-43\\tsql\\query"
  State=1
  StackTrace:
       at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
       at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
       at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
       at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
       at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
       at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
       at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
       at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
       at ADONET_namespace.ADONET_methods.AppendDataCT(DataTable dt, Dictionary`2 dic) in c:\Documents and Settings\Admin\My Documents\Visual Studio 2008\WebSites\Jerry\App_Code\ADONET methods.cs:line 102


这是相关的代码。当我调试此代码时,“ dic”仅循环遍历3个列名,但没有查看存储在“ dt”(数据表)中的行值。

public static string AppendDataCT(DataTable dt, Dictionary<string, string> dic)
{
    if (dic.Count != 3)
        throw new ArgumentOutOfRangeException("dic can only have 3 parameters");

    string connString = ConfigurationManager.ConnectionStrings["AW3_string"].ConnectionString;
    string errorMsg;

    try
    {               
        using (SqlConnection conn2 = new SqlConnection(connString))
        {
            using (SqlCommand cmd = conn2.CreateCommand())
            {
                cmd.CommandText = "dbo.AppendDataCT";
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Connection = conn2;
                foreach (string s in dic.Keys)
                {
                    SqlParameter p = cmd.Parameters.AddWithValue(s, dic[s]);
                    p.SqlDbType = SqlDbType.VarChar;
                }

                conn2.Open();
                cmd.ExecuteNonQuery();
                conn2.Close();
                errorMsg = "The Person.ContactType table was successfully updated!";
            }
        }
    }


这是我的SQL存储过程:

ALTER PROCEDURE [dbo].[AppendDataCT] 
@col1 VARCHAR(50), 
@col2 VARCHAR(50),
@col3 VARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TEMP DATETIME
SET @TEMP = (SELECT CONVERT (DATETIME, @col3))

INSERT INTO Person.ContactType (Name, ModifiedDate)
VALUES( @col2, @TEMP)
END


输入文件有3列。前两个是varchars,但我认为第三个也是varchar,但表示为“ 3/11/2010”。在此输入文件中,示例行如下所示:
“本杰明|早餐| 2010年3月11日”。
我正在尝试在我的SP中将此日期字段从字符串转换为日期时间。我会以错误的方式处理吗?

数据行:
col1 | col2 | col3
11 | A2 | 1/10/1978
12 | b2 | 2/10/1978
13 | c2 | 3/10/1978
14 | d2 | 4/10/1978

最佳答案

我认为Belousov Pavel是正确的。在foreach内部,将每个字典项分配为一个参数。这些参数中的每一个都定义为VarChar。根据提供的信息,可以合理地假设问题出在存储过程中。

您可以发布存储过程的代码还是通过在其中执行存储过程来尝试在SQL Management Studio中重新创建错误。

更新...

查看存储过程后,代码看起来正确。我能够使用以下sql代码生成错误消息。

声明@ col3 varchar(50)

设置@ col3 ='| 3/11/2010'

声明@temp datetime

设置@temp =(选择convert(datetime,@ col3))

请注意,@ col3的值以竖线字符开头。如果删除竖线字符,它将正常工作。

我会仔细看一下从中获取参数值的字典中的值。您解析数据的方式可能有问题。

更新2

以下代码尚未确认能正常工作,但我想我知道您要执行的操作。我假设您要传入的DataTable具有如下数据:

col1 | col2 | col3
11 | A2 | 1/10/1978
12 | b2 | 2/10/1978
13 | c2 | 3/10/1978
14 | d2 | 4/10/1978

如果是这种情况,我们不需要最初传入的字典。我还可以假设您希望对DataTable中的每一行执行一次存储过程。尽管下面的方法为每一行运行存储过程,但它与您的操作类似。

我不确定您的解释是,DataTable的第一行是否包含列名,如果不是,那么就不用担心了。希望这有道理,如果您有任何疑问,请留下更多评论。

    public static string TestMethod(DataTable dt)
    {
        string connString = "";
        string errorMsg = string.Empty;

        try
        {
            //loop through each row of the datatable. Not sure if the column names is a row.
            foreach (DataRow row in dt.Rows)
            {
                using (SqlConnection conn2 = new SqlConnection(connString))
                {
                    using (SqlCommand cmd = conn2.CreateCommand())
                    {
                        cmd.CommandText = "dbo.AppendDataCT";
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Connection = conn2;

                        cmd.Parameters.Add(new SqlParameter() { ParameterName = "@col1", SqlDbType = SqlDbType.VarChar, Value = row[0] });
                        cmd.Parameters.Add(new SqlParameter() { ParameterName = "@col2", SqlDbType = SqlDbType.VarChar, Value = row[1] });
                        cmd.Parameters.Add(new SqlParameter() { ParameterName = "@col3", SqlDbType = SqlDbType.VarChar, Value = row[2] });

                        conn2.Open();
                        cmd.ExecuteNonQuery();
                        conn2.Close();
                    }
                }                
            }
            errorMsg = "The Person.ContactType table was successfully updated!";
        }
        catch
        {
        }

        return errorMsg;
    }

关于c# - 从字符串转换日期时间时转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3008306/

相关文章:

visual-studio-2008 - 提取 Visual Studio 主题?

visual-studio-2008 - 我可以在 32 位机器上构建 x64 应用程序吗?

visual-studio-2008 - 为什么 Visual Studio 2008 跳过我的断点?

c# - log4net 不能在 Windows 服务中工作

sql-server - 在数据库服务器上查询消耗 CPU

c# - 文件被复制然后提示它不存在

sql - 使用存储过程访问数据

sql-server-2005 - 将表达式转换为数据类型 int 时出现算术溢出错误

c# - 在 C# (.NET) 中是否有任何函数可以相应地比较字符串的长度?

c# - Lambda 和内存泄漏 : Looking for alternative approaches