2016-11-15 52 views
0

我一直在網上尋找答案,但還沒有發現任何東西。我有一個小的控制檯應用程序,我試圖插入一些數據到SQL Server數據庫(.mdf數據庫文件),一切都運行沒有錯誤,但當我在服務器資源管理器事實後打開數據庫時,數據不存在。無法獲取數據提交到SQL Server

這是代碼:

using (TransactionScope scope = new TransactionScope()) 
{ 
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameBudgetDB"].ToString())) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 

     conn.Open(); 

     cmd.CommandText = string.Format("SELECT TOP 1 category_id FROM businesses WHERE '{0}' LIKE CONCAT('%',description,'%')", transDescription.Replace("'", "''")); 

     SqlDataReader reader = cmd.ExecuteReader(); 

     try 
     { 
      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        categoryId = (int)reader[0]; 
       } 
      } 
      else 
      { 
       categoryId = 44; // Unknown 
      } 
     } 
     finally 
     { 
      reader.Close(); 
     } 

     // Get Transaction Type 
     int transTypeId = 0; 
     cmd.CommandText = string.Format("SELECT trans_type_id FROM transaction_types WHERE description = '{0}'", transType); 

     reader = cmd.ExecuteReader(); 

     try 
     { 
      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        transTypeId = (int)reader[0]; 
       } 
      } 
     } 
     finally 
     { 
      reader.Close(); 
     } 

     SqlTransaction trans = conn.BeginTransaction("InsertTransactiolns"); 

     try 
     { 
      cmd.Transaction = trans; 
      cmd.CommandText = string.Format(
           "BEGIN " + 
             "IF NOT EXISTS(SELECT * FROM transactions " + 
                    "WHERE transaction_date = '{0}' " + 
                    "AND description = '{1}' " + 
                    "AND trans_type_id = {2} " + 
                    "AND amount = {3} " + 
                    "AND(category_id = {5} OR previous_category_id = {5})) " + 
            "BEGIN " + 
              "INSERT INTO transactions(transaction_date, description, trans_type_id, import_date, category_id, amount) " + 
              "VALUES('{0}', '{1}', {2}, '{4}', {5}, {3}) " + 
            "END " + 
           "END", transDate, transDescription.Replace("'", "''"), transTypeId, amount, DateTime.Now, categoryId); 

      rowsInserted = rowsInserted + cmd.ExecuteNonQuery(); 
      trans.Commit(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 

      try 
      { 
       trans.Rollback(); 
      } 
      catch (Exception e2) 
      { 
       Console.WriteLine(e2.Message); 
      } 
     }           
    } 
} 

數據庫連接字符串是:

<connectionStrings> 
    <add name="FrameBudgetDB" 
     connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|FrameBudget.mdf;Integrated Security=True;Connect Timeout=30" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 

和數據目錄是:

AppDomain.CurrentDomain.SetData("DataDirectory", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FrameBudget\")); 
+0

檢查此問題http://stackoverflow.com/questions/17147249/why-saving-changes-to -a-database-failures – Steve

+0

有趣的是,即使我明確地設置了數據目錄,並且當我通過應用程序進行調試並查看連接屬性時,數據庫顯示爲位於ProgramData中的正確數據庫? – devonuto

+0

並在服務器瀏覽器中的連接? – Steve

回答

1

真的不清楚爲什麼你TransactionScope實例和對BeginTransaction的調用。我只會使用其中的一個。但是這條線

using (TransactionScope scope = new TransactionScope()) 
{ 
    ... 

需要成功的情況下完成與

scope.Complete(); 
} 

沒有調用完成,退出使用塊意味着回滾。
我會與呼叫刪除塊

SqlTransaction trans = conn.BeginTransaction("InsertTransactiolns"); 

,相對回滾或提交調用只留下TransactionScope的實例(簡單了很多處理)。

作爲一個側面說明。您的代碼易受Sql注入攻擊。該string.Format是一種字符串連接的形式,我們都知道nasty things that can happen與字符串連接方法來建立sql查詢

+0

是的,我認爲這可能會讓人困惑。事實之後,我在SqlTransaction中添加了,因爲我認爲它可能會起作用。以前我只使用範圍,而且我也使用了cmd.AddParameterWithValue()。對參數化字符串的更改是爲了能夠抓取SQL並直接在數據庫上運行它來測試它是否正常工作。 但你是正確的,我錯過了scope.Complete()調用。 正如你在這裏看到的,我早些時候使用它,但不是在這裏:https://github.com/devonuto/VSApplications/blob/master/FrameBudget/FrameBudget/Program.cs – devonuto

+0

我會再次嘗試,一旦我回家,但我懷疑缺失的線是問題。 – devonuto

+0

好吧,祝你好運,晚安(至少對我來說) – Steve