我正在开发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/