我从ACCESS中取到数据存到Datatable中,然后用sqlbulkcopy插入到SQL,但是ACCESS数据库中有的类型是bigint无法插入到SQL中,该怎么解决??
没有找到为什么插不了,access的数据都是int或者float类型,查到Datatable中都是object类型,但是使用sqlbuckcopy插入到sql数据库就提示有string类型无法转换成bigint,或者float类型,最后只能用SQL语句单独将报错的表插入进去。
试试把bigint 转换成long 类型
我遍历了Datatable的每一列的类型,如果是bigint就转换,但是好像没用
@Gilgamos: 打个断点进去看看转换成功没,然后看下报的错误是什么
@面具灬: 突然发现是sql中的表是bigint类型,string类型的值无法插进去。。
@Gilgamos: 字符串和数值。。。
SQL Server 本来就支持 bigint 类型,C# 对应的类型是 Int64 ,如果 SQL Server 中对应的字段不是 bigint 类型,才需要转换
恩,发现了。。sql中表的类型是bigint,然而我取到的值好像有string类型的
@Gilgamos: Int64.Parse()
转换一下
@dudu: 在包含数据的情况下无法转换类型。。。
@Gilgamos: 建议提供对应的代码
@dudu: for (int j=0;j<dd.Rows.Count-1;j++)
{
object value = dd.Rows[j]["name"].ToString();
OleDbDataAdapter inst = new OleDbDataAdapter("SELECT * FROM "+ value + "", dbconn);//选择全部内容
DataTable ds = new DataTable();//临时存储
inst.Fill(ds);//用inst填充ds
foreach (System.Data.DataColumn k in ds.Columns)
{
if (k.DataType == typeof(long))
{
k.DataType = typeof(long);
}
}
@Gilgamos: 提供的代码不够
@dudu: {
string Con = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=D:\jzl\Samples - 副本\13米空心板.mdb";//第二个参数为文件的路径
OleDbConnection dbconn = new OleDbConnection(Con);
OleDbConnection dbconn2 = new OleDbConnection(Con);
dbconn.Open();//建立连接
OleDbDataAdapter inst2 = new OleDbDataAdapter("SELECT name FROM msysobjects WHERE type=1 and flags=0", dbconn2);//选择全部内容
DataTable dd = new DataTable();//临时存储
inst2.Fill(dd);//用inst填充ds
string Pid = "JZL" + GenerateRandomCode(10);
dd.Rows.RemoveAt(20);
dd.Rows.RemoveAt(21);
dd.Rows.RemoveAt(31);
DataTable dt = dd;
for (int j = 0; j < dd.Rows.Count - 1; j++)
{
object value = dd.Rows[j]["name"].ToString();
OleDbDataAdapter inst = new OleDbDataAdapter("SELECT * FROM "+ value + "", dbconn);//选择全部内容
DataTable ds = new DataTable();//临时存储
inst.Fill(ds);//用inst填充ds
////foreach (System.Data.DataColumn k in ds.Columns)
////{
//// if (k.DataType == typeof(long))
//// {
//// k.DataType = typeof(long);
//// }
////}
DataColumn dc = new DataColumn("F_ID", typeof(string));
ds.Columns.Add(dc);
DataColumn dc1 = new DataColumn("F_ProjectID", typeof(string));
ds.Columns.Add(dc1);
DataColumn dc2 = new DataColumn("F_SortCode", typeof(int));
ds.Columns.Add(dc2);
DataColumn dc3 = new DataColumn("F_DeleteMark", typeof(int));
ds.Columns.Add(dc3);
DataColumn dc4 = new DataColumn("F_EnabledMark", typeof(int));
ds.Columns.Add(dc4);
DataColumn dc5 = new DataColumn("F_Description", typeof(string));
ds.Columns.Add(dc5);
DataColumn dc6 = new DataColumn("F_CreateDate", typeof(DateTime));
ds.Columns.Add(dc6);
DataColumn dc7 = new DataColumn("F_CreateUserId", typeof(string));
ds.Columns.Add(dc7);
DataColumn dc8 = new DataColumn("F_CreateUserName", typeof(string));
ds.Columns.Add(dc8);
DataColumn dc9 = new DataColumn("F_ModifyDate", typeof(string));
ds.Columns.Add(dc9);
DataColumn dc10 = new DataColumn("F_ModifyUserId", typeof(string));
ds.Columns.Add(dc10);
DataColumn dc11 = new DataColumn("F_ModifyUserName", typeof(DateTime));
ds.Columns.Add(dc11);
for (int i = 0; i <= ds.Rows.Count - 1; i++)
{
string id = "JZL" + GenerateRandomCode(10);
ds.Rows[i]["F_ID"] = id;
ds.Rows[i]["F_ProjectID"] = Pid;
ds.Rows[i]["F_CreateDate"] = DateTime.Now;
}
/* dataGridView1.DataSource = ds;*///展示ds第一张表到dataGridView1控件
string conn = ("Data Source=.;Initial Catalog=WPFramework_Base_2019;User ID=sa;Password=sa");
SqlBulkCopyInsert(conn, value.ToString(), ds);
}
dbconn.Close();//关闭连接
}
public static void SqlBulkCopyInsert(string conStr, string strTableName, DataTable dtData)
{
try
{
using (SqlBulkCopy sqlRevdBulkCopy = new SqlBulkCopy(conStr)) //引用SqlBulkCopy
{
sqlRevdBulkCopy.DestinationTableName = strTableName; //数据库中对应的表名
sqlRevdBulkCopy.NotifyAfter = dtData.Rows.Count; //有几行数据
sqlRevdBulkCopy.WriteToServer(dtData); //数据导入数据库
sqlRevdBulkCopy.Close(); //关闭连接
}
}
catch (Exception ex)
{
throw (ex);
}
}
@Gilgamos: 那个字段的类型是 bigint ?
@dudu: 这个是把数据插入到SQL里面,然后SQL里面有的表的字段类型是BIGINT,数据是从ACCESS里面查出来的
@Gilgamos: 假如 F_ProjectID 是 bigint 类型的字段,则改为下面的代码:
DataColumn dc1 = new DataColumn("F_ProjectID", typeof(long));