C# 插入到sql server

C# 插入到sql server,c#,insert,sql-server-2008-r2,ms-access-2000,C#,Insert,Sql Server 2008 R2,Ms Access 2000,我必须将ms access中的数据插入sql server。我的逻辑是: 获取ms access中的名称列表 在插入前禁用外键和触发器 阅读每个表格 通过SetAdded()方法更改每行的RowState 最后,使用命令生成器插入它 错误 表(Ms Access)中的一个字段具有数据类型Date/Time。但它只有时间值,没有日期部分。在插入过程中会出现错误。“SqlDateTime溢出。必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。” 在d

我必须将ms access中的数据插入sql server。我的逻辑是:

  • 获取ms access中的名称列表

  • 在插入前禁用外键和触发器

  • 阅读每个表格

  • 通过SetAdded()方法更改每行的RowState

  • 最后,使用命令生成器插入它

  • 错误

    表(Ms Access)中的一个字段具有数据类型Date/Time。但它只有时间值,没有日期部分。在插入过程中会出现错误。“SqlDateTime溢出。必须介于1/1/1753 12:00:00 AM和12/31/9999 11:59:59 PM之间。”

    在dataset visualizer中,我看到了值12/30/1899 1:01:01 AM

    如何解决这个问题

            try
            {
                oleCon = new OleDbConnection();
                oleCon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Client Work\Client Docs\Don\ABCMotor.mdb;User Id=admin;Password=;";
                oleCon.Open();
                dt = new DataTable();
                dt = oleCon.GetSchema("tables");
    
                sqlCon = new SqlConnection(@"Server=ACER-PC\SQLEXPRESS2008R2;Database=ABC;Integrated Security=SSPI;");
                sqlCon.Open();
                SqlCommandBuilder sqlCmdB = new SqlCommandBuilder();
                sqlCmd = new SqlCommand();
                SqlTransaction sqlTran;
                sqlTran = sqlCon.BeginTransaction();
                sqlCmd.Connection = sqlCon;
                sqlCmd.Transaction = sqlTran;
                sqlCmd.CommandText = "sp_msforeachtable";
                sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? NOCHECK CONSTRAINT all");
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sqlCmd.ExecuteNonQuery();
    
                sqlCmd = new SqlCommand();
                sqlCmd.Connection = sqlCon;
                sqlCmd.Transaction = sqlTran;
                sqlCmd.CommandText = "sp_msforeachtable";
                sqlCmd.Parameters.Clear();
                sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? DISABLE TRIGGER  all");
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sqlCmd.ExecuteNonQuery();
    
                foreach (DataRow row in dt.Rows)
                {
                    if (row["Table_Name"].ToString().StartsWith("MSys") == false)
                    {
                        oleDa = new OleDbDataAdapter("Select * from [" + row["Table_Name"] + "]", oleCon);
                        ds = new DataSet();
                        oleDa.Fill(ds);
    
                        if (ds.Tables[0].Rows.Count > 0)
                        {
                            sqlDa = new SqlDataAdapter("Select * from [" + row["Table_Name"] + "]", sqlCon);
                            sqlDa.SelectCommand.Transaction = sqlTran;
                            foreach (DataRow item in ds.Tables[0].Rows)
                            {
                                item.SetAdded();
                            }
                            sqlCmdB.DataAdapter = sqlDa;
    
                            sqlCmdB.GetInsertCommand();
    
                            sqlDa.Update(ds);                                         
                        }
                    }
                }
    
                sqlCmd = new SqlCommand();
                sqlCmd.Connection = sqlCon;
                sqlCmd.Transaction = sqlTran;
                sqlCmd.CommandText = "sp_msforeachtable";
                sqlCmd.Parameters.Clear();
                sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all");
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sqlCmd.ExecuteNonQuery();
                sqlCmd = new SqlCommand();
                sqlCmd.Connection = sqlCon;
                sqlCmd.Transaction = sqlTran;
    
                sqlCmd.CommandText = "sp_msforeachtable";
                sqlCmd.Parameters.Clear();
                sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? ENABLE TRIGGER  all");
                sqlCmd.CommandType = CommandType.StoredProcedure;
                sqlCmd.ExecuteNonQuery();
                sqlTran.Commit();
            }
            catch (Exception ex)
            {
    
                MessageBox.Show(ex.Message);
            }
    
    尝试使用
    FillSchema()
    ,以确保数据适配器确切地知道它正在处理的数据类型

    OleDbDataAdapter.FillSchema("", SchemaType.Source)
    

    您仍然需要调用
    Fill()
    方法来获取数据。

    在dataset visualizer中,我看到了12/30/1899 1:01:01 AM的值。仔细看看。我偶尔会从JET数据库加载数据,如果我遇到这个错误,通常一个用户已经花了一年的时间。例如201而不是2013。这是更改后的代码ds.Tables.Add()//添加了1个表,因此它不会给出任何错误oleDa.FillSchema(ds.Tables[0],schemaType.Source)//VS在放置“”而不是ds.表[0]时出错。它不会给出错误,但也不会插入。