insert to sql server



我必须从访问sql服务器的ms插入数据。我的逻辑是:

  1. 获取ms访问中的名称列表。

  2. 插入前禁用外键和触发器。

  3. 阅读每张表格。

  4. 通过SetAdded()方法更改每行的RowState。

  5. 最后使用命令生成器插入

错误

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

在数据集可视化工具中,我看到了1899年12月30日凌晨1点01分的数值。

如何解决。

        try
        {
            oleCon = new OleDbConnection();
            oleCon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:Client WorkClient DocsDonABCMotor.mdb;User Id=admin;Password=;";
            oleCon.Open();
            dt = new DataTable();
            dt = oleCon.GetSchema("tables");
            sqlCon = new SqlConnection(@"Server=ACER-PCSQLEXPRESS2008R2;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()方法来获取数据。

相关内容

  • 没有找到相关文章

最新更新