簡體   English   中英

ADO.Net INSERT 不插入數據

[英]ADO.Net INSERT not inserting data

我有 ac#.Net 4.5 控制台應用程序,我正在嘗試將數據從 DataTable 插入到 SQL Server 2008R2 數據庫表。 我沒有收到錯誤,但沒有插入數據。 這是我的代碼:

Int32 newID = 0;
DataTable dtMaxUserID = GeneralClassLibrary.GeneralDataAccessLayer.ExecuteSelect("SELECT MAX(UserID)+1 AS NewID FROM TIUser", false, "TrackitCN");
newID = Convert.ToInt32(dtMaxUserID.Rows[0]["NewID"].ToString());

//Get new users from AllUserData
DataColumn dcRowID = new DataColumn("RowID", typeof(Int32));
//dcRowID.AllowDBNull = false;
dcRowID.AutoIncrement = true;
dcRowID.AutoIncrementSeed = 1;
dcRowID.AutoIncrementStep = 1;
//dcRowID.Unique = true;
//dcRowID.ColumnName = "RowID";
DataTable dtNewUsers = new DataTable();
dtNewUsers.Columns.Add(dcRowID);
dtNewUsers.Columns.Add("MaxID");
dtNewUsers.Columns.Add("UserID");
dtNewUsers.Columns.Add("FullName");
dtNewUsers.Columns.Add("Title");
dtNewUsers.Columns.Add("Phone");
dtNewUsers.Columns.Add("EMailAddr");
dtNewUsers.Columns.Add("Fax");
dtNewUsers.Columns.Add("Dept");
dtNewUsers.Columns.Add("Dept_Num");
dtNewUsers.Columns.Add("Location");
dtNewUsers.Columns.Add("UserDef_1");
dtNewUsers.Columns.Add("UserDef_2");
dtNewUsers.Columns.Add("Login");
dtNewUsers.Columns.Add("Password");
dtNewUsers.Columns.Add("PasswordFlags");
dtNewUsers.Columns.Add("LanguageID");
dtNewUsers.Columns.Add("NTAuthentication");
dtNewUsers.Columns.Add("NTAccount");
dtNewUsers.Columns.Add("SID");
dtNewUsers.Columns.Add("SelfServiceAccess");
dtNewUsers.Columns.Add("ImagePath");
dtNewUsers.Columns.Add("CompFlag");
dtNewUsers.Columns.Add("Employee_ID");
dtNewUsers.Columns.Add("SessionID");
string strQuery = "SELECT " + newID + " AS MaxID, LName" + ", " + "FName AS FullName, Title, Phone, EMail AS EmailAddr, Fax, Department AS Dept, Office AS Location, [Login] AS Employee_ID FROM [User] WHERE StartDate >= CAST(DATEPART(year,getdate()) AS varchar) + '-' + CAST(DATEPART(month,getdate()) AS varchar) + '-' + CAST(DATEPART(day,getdate())-1 AS varchar)";
DataTable dtTemp = GeneralClassLibrary.GeneralDataAccessLayer.ExecuteSelect(strQuery, false, "AllUserDataCN");
foreach (DataRow row in dtTemp.Rows)
    dtNewUsers.ImportRow(row);

SqlTransaction tran = null;
    try
    {
        connection.Open();
        tran = connection.BeginTransaction();

        //Insert new users into TIUser
        SqlDataAdapter TIUser_adapter = new SqlDataAdapter();
        string queryString = "SELECT * FROM TIUser WHERE 1 = 0";
        TIUser_adapter.SelectCommand = new SqlCommand(queryString, connection, tran);
        TIUser_adapter.Fill(dtNewUsers);
        dtNewUsers.AcceptChanges();
        TIUser_adapter.Update(dtNewUsers);

        tran.Commit();
    }
    catch (System.Exception ex)
    {
        tran.Rollback();
        throw ex;
    }
    finally
    {
        connection.Close();
    }

GeneralClassLibrary 是我們在這里用於許多事情的類庫; 這里它只是在數據庫上執行一個 SELECT 語句。 TIUser 是數據庫表。 數據表 dtNewUsers 包含一行。 我已經通過調試代碼並在 ImportRow 完成后檢查 DataTable 來驗證這一點。


在遵循 user3787557(謝謝!)的回復后,我更接近了,但我遇到了並發沖突。 我正在開發一個數據庫,我所做的只是插入一條記錄,所以我不知道為什么會出現並發沖突。 一種可能性:我通過添加兩列來更改 DataTable dtNewUsers 的結構。 但是,在進行更新之前,我刪除了這些列。 InsertCommand 很好; 我已經在 SSMS 中檢查過它並進行了解析。 這是我的新代碼:

using (SqlConnection connection = new SqlConnection(GeneralClassLibrary.GeneralConfigurationManager.ConnectionStrings["TrackitCN"].ConnectionString))
        {
            SqlTransaction tran = null;
            connection.Open();
            tran = connection.BeginTransaction();

            try
            {
                //Create empty TIUser Data Adapter
                SqlDataAdapter TIUser_adapter = new SqlDataAdapter();
                SqlCommandBuilder TIUser_builder = new SqlCommandBuilder(TIUser_adapter);
                string queryString = "SELECT * FROM TIUser WHERE 1 = 0";
                TIUser_adapter.SelectCommand = new SqlCommand(queryString, connection, tran);
                TIUser_adapter.InsertCommand = TIUser_builder.GetInsertCommand();
                TIUser_adapter.UpdateCommand = TIUser_builder.GetUpdateCommand();

                //Get new users from AllUserData
                DataTable dtNewUsers = new DataTable();
                TIUser_adapter.Fill(dtNewUsers);
                DataColumn dcRowID = new DataColumn("RowID", typeof(Int32));
                dcRowID.AutoIncrement = true;
                dcRowID.AutoIncrementSeed = 1;
                dcRowID.AutoIncrementStep = 1;
                dtNewUsers.Columns.Add(dcRowID);
                dtNewUsers.Columns.Add("MaxID");                                        string strQuery = "SELECT " + newID + " AS MaxID, LName + ', ' + FName AS FullName, Title, Phone, EMail AS EmailAddr, Fax, Department AS Dept, Office AS Location, [Login] AS Employee_ID FROM [User] WHERE StartDate >= CAST(DATEPART(year,getdate()) AS varchar) + '-' + CAST(DATEPART(month,getdate()) AS varchar) + '-' + CAST(DATEPART(day,getdate())-1 AS varchar)";
                DataTable dtTemp = GeneralClassLibrary.GeneralDataAccessLayer.ExecuteSelect(strQuery, false, "AllUserDataCN");
                foreach (DataRow row in dtTemp.Rows)
                    dtNewUsers.ImportRow(row);

                //Make sure new users aren't already in Trackit
                foreach (DataRow row in dtNewUsers.Rows)
                {
                    row["UserID"] = (Convert.ToInt32(row["RowID"]) + Convert.ToInt32(row["MaxID"])).ToString();
                    DataTable dtOverlap = GeneralClassLibrary.GeneralDataAccessLayer.ExecuteSelect("SELECT * FROM TIUser WHERE Employee_ID = '" + row["Employee_ID"].ToString() + "'", false, "TrackitCN");
                    if (dtOverlap.Rows.Count > 0)
                        dtNewUsers.Rows.Remove(row);
                }    

                //Remove MaxID and RowID Columns
                dtNewUsers.Columns.Remove("MaxID");
                dtNewUsers.Columns.Remove("RowID")

                TIUser_adapter.Update(dtNewUsers);
                tran.Commit();
            }
            catch (System.Exception ex)
            {
                GeneralClassLibrary.GeneralEmail.ExceptionNotification(System.Reflection.Assembly.GetExecutingAssembly().ToString(), ex.Message, ex.StackTrace);
                tran.Rollback();
                throw ex;
            }
            finally
            {
                connection.Close();
            }
        }

我得到的堆棧跟蹤是:

   at System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)


at System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)



at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)



at System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)



at System.Data.Common.DbDataAdapter.Update(DataTable dataTable)



at UpdateTrackitUsers.Program.Main(String[] args) in c:\Users\06717\Documents\Visual Studio 2012\Projects\UpdateTrackitUsersConsole\UpdateTrackitUsersConsole\Program.cs:line 91

第 87 行是:

TIUser_adapter.Update(dtNewUsers);

這是對我有用的代碼。 基本上,您在代碼中缺少的是使用 SqlCommandBuilder 創建 InsertCommand 和 UpdateCommand。 還 GET RID 的 AcceptChanges()。 這將導致新行不會發送到數據庫。 最后一件事:確保使用“請勿復制”標記 MDF 數據庫文件(如果您正在使用)屬性,否則每次編譯時數據庫都會被覆蓋,並且您看不到更改。

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommandBuilder builder = new SqlCommandBuilder(adapter);

    adapter.SelectCommand = new SqlCommand(queryString, connection);
    adapter.InsertCommand = builder.GetInsertCommand();
    adapter.UpdateCommand = builder.GetUpdateCommand();
    adapter.DeleteCommand = builder.GetDeleteCommand();

    DataTable dt = new DataTable();
    adapter.Fill(dt);

    DataRow row = dt.NewRow();
    row["RegionID"] = 5;
    row["RegionDescription"] = "Some region";
    dt.Rows.Add(row);

    //dt.AcceptChanges();

    int counter = adapter.Update(dt); 
}                    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM