C# 错误:在执行插入时从字符串转换日期和/或时间时,转换失败
我试图从本地数据库中选取一些现有值,并将其推送到实时数据库中。代码运行良好,现在在部署之前,我面临这个问题。请给我解答C# 错误:在执行插入时从字符串转换日期和/或时间时,转换失败,c#,sql-server,C#,Sql Server,我试图从本地数据库中选取一些现有值,并将其推送到实时数据库中。代码运行良好,现在在部署之前,我面临这个问题。请给我解答 SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("Select OPTION_V_DATE, OPTION_V_ER, COMMON_SND, COMMON_SCD, COMMON_OAD, NOTIFY_ID, CREATEDATE, MODIFYDATE, [USER_ID], SMART_EXTRACT, CATEGO
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("Select OPTION_V_DATE, OPTION_V_ER, COMMON_SND, COMMON_SCD, COMMON_OAD, NOTIFY_ID, CREATEDATE, MODIFYDATE, [USER_ID], SMART_EXTRACT, CATEGORY_NUM From REVIEW_NJ_OPTION_5_INFO Order By ID DESC", Cn);
SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter);
DataSet selectResults = new DataSet();
sqlDataAdapter.Fill(selectResults); // get dataset
foreach (DataRow row in selectResults.Tables[0].Rows)
{
using (SqlConnection Con = new SqlConnection(@".."))
{
Con.Open();
SqlCommand RD = new SqlCommand("Insert Into NJ_OPTION_5_INFO (OPTION_V_DATE, OPTION_V_ER, COMMON_SND, COMMON_SCD, COMMON_OAD, NOTIFY_ID, CREATEDATE, MODIFYDATE, [USER_ID], SMART_EXTRACT, CATEGORY_NUM)Values('" + row["OPTION_V_DATE"].ToString() + "', '" + row["OPTION_V_ER"].ToString() + "', '" + row["COMMON_SND"].ToString() + "', '" + row["COMMON_SCD"].ToString() + "', '" + row["COMMON_OAD"].ToString() + "', '" + row["NOTIFY_ID"].ToString() + "', '" + row["CREATEDATE"].ToString() + "', '" + row["MODIFYDATE"].ToString() + "', '" + row["USER_ID"].ToString() + "', '" + row["SMART_EXTRACT"].ToString() + "', '" + row["CATEGORY_NUM"].ToString() + "')", Con);
RD.ExecuteNonQuery();
Con.Close();
}
}
这是因为两个数据库的日期和时间格式不同。如果您是以DateTime格式获取日期,则将其以DateTime格式发送到第二个数据库,即代替
行[“OPTION\u V\u date”]。ToString()
你需要写:
Convert.ToDateTime(row["OPTION_V_DATE"])
如果要从第一个数据库中以字符串形式获取日期,则需要将特定字符串转换为DateTime格式或配置第二个数据库的格式化DateTime字符串。假设您将日期设置为字符串形式的dd-MM-yyyy
格式,并且您的第二个数据库配置为yyy-MM-dd
格式,那么您可以这样做:
DateTime dt = DateTime.ParseExact(row["OPTION_V_DATE"].ToString(), "dd'-'MM'-'yyyy", CultureInfo.InvariantCulture);
string ss = dt.ToString("yyyy'-'MM'-'dd");
现在,您希望发送哪一个-您可以发送
dt
或ss
。这两种方法都可以使用。我对列选项使用Datatype Date,对CREATEDATE和MODIFYDATE使用Date和DateTime。首先,您确实应该使用参数来避免潜在的sql注入。其次,您需要将要放入查询中的数据包括在内,特别是行[“OPTION_V_DATE”]、行[“CREATEDATE”]、行[“CREATEDATE”]、行[“MODIFYDATE”]和行[“MODIFYDATE”]的值是什么。ToString()=“2015-09-18 20:29:47.000”,行[“CREATEDATE”]。ToString()='2015-09-18 20:29:47.000'您能否发布失败的sql命令生成的sql字符串?或者,您可以运行sql探查器捕获相关记录以进行分析。@Kar:CREATEDATE='2015-09-18 20:29:47.000'和MODIFYDATE='2015-09-18 20:29:47.000'label2.Text=DateTime.Now.ToString(“yyyy-MM-dd HH:MM:ss”);和Datepick.Text=dateTimePicker1.Value.Date.ToString(“yyyy-MM-dd”);我像这样选择日期和日期时间。是的,我会试试看。很多人不知道这两个数据库的格式。。。我有一个yyyy-MM-dd的例子。但是你需要先为两个数据库选择datetime格式,最好不要转换成字符串。您需要像convert.ToDatetime(行[“option_v_date”])一样转换db1的值,并在第二个数据库中存储相同的datetime格式在我插入第二个数据库时出现问题。Convert.ToDateTime(行[“OPTION\u V\u DATE”])无法帮助。还有其他线索吗。昨天天气很好。问题是从今天早上的“+row[“CREATEDATE”]”开始出现的。ToString()+“”任何替代方法,我都想尽一切办法,在这上面浪费了一整天的时间