2013-07-07 49 views
0

我的連接字符串中使用是這樣的不同:App.config中的作用比普通方式

SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=G:\I.S\C#\billingSystem\Store.mdf;Integrated Security=True;User Instance=True"); 

,所以我可以(插入,更新,刪除)這一點:

SqlCommand cmd = new SqlCommand("SQLSTATEMENT", cn); 
    cn.Open(); 
    cmd.ExecuteNonQuery(); 
    cn.Close(); 

我已經在YouTube上看到的教程稱爲「部署C#項目」,當他用

System.Configuration; 

app.config文件,所以我跟着政黨成員里亞爾完全相同的方式,它的工作原理。

在運行後我(插入,更新,刪除)一切都沒問題,直到我關閉應用程序,就像我沒有做任何事情,我插入的數據都沒有了!

我需要在運行時將更改保存到表中。

一些信息:Winforms應用程序,樣品從我的代碼:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    </configSections> 
    <connectionStrings> 
     <add name="SchoolProjectConnectionString" 
      connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SchoolDB.mdf;Integrated Security=True;User Instance=True" 
      providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

namespace SchoolProject 
{ 
    public partial class Main : Form 
    { 
     SqlConnection cn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["SchoolProjectConnectionString"].ToString()); 
     public Main() 
     { 
      InitializeComponent(); 
     } 

     private void button4_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string myValue = Interaction.InputBox("Enter ID", "ID", "", 100, 100); 
      string myValue0 = Interaction.InputBox("Enter Name", "Name", "", 100, 100); 
      int X = Convert.ToInt32(myValue); 

      SqlCommand cmd = new SqlCommand("Insert into Student(ID, Student) Values ('" + X + "','" + myValue0 + "')", cn); 
      cn.Open(); 
      cmd.ExecuteNonQuery(); 
      cn.Close(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      string myValue3 = Interaction.InputBox("Enter ID", "ID", "", 100, 100); 
      int X = Convert.ToInt32(myValue3); 

      SqlCommand cmd = new SqlCommand("SELECT * FROM Student WHERE id = '" + X + "'", cn); 
      cn.Open(); 
      SqlDataReader reader = cmd.ExecuteReader(); 
      if (reader.HasRows) 
      { 
       while (reader.Read()) 
       { 
        MessageBox.Show(reader["Student"].ToString()); 
       } 
      } 
      cn.Close(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      Report R = new Report(); 
      R.Show(); 
     } 
    } 
} 
+0

在您的Visual Studio調試器中,連接字符串或app.config的行爲不可能與運行時不同。除非您指定明確使用[XDT轉換](http://msdn.microsoft.com/zh-cn/library/dd465326.aspx)。請將你的app.config的內容添加到問題中;如果您的項目中沒有出現任何錯誤,但似乎確實起作用,那麼您可能正在與另一個數據庫交談? –

+1

檢查你的項目,Db在解決方案Expl中是否可見,是否有CopyLocal = true? –

+0

是它可見,如何知道它是否有CopyLocal = true? –

回答

2

整個用戶實例和AttachDbFileName =方法是有缺陷的 - 在最好的!在Visual Studio中運行應用程序時,它將複製.mdf文件(從您的App_Data目錄到輸出目錄 - 通常爲.\bin\debug) - 最有可能爲,您的INSERT工作得很好 - 但是您只是看着錯誤.mdf文件到底!

如果你想堅持這種方法,那麼試着在myConnection.Close()調用上放一個斷點 - 然後用SQL Server Mgmt Studio Express檢查.mdf文件 - 我幾乎可以確定你的數據在那裏。

在我看來真正的解決方案

  1. 安裝SQL Server Express(和你已經做到這一點無論如何)

  2. 安裝SQL Server Management Studio中快速

  3. 中創建您的數據庫SSMS Express,給它一個邏輯名稱(例如Store

  4. 使用其邏輯連接數據庫名稱(在服務器上創建時給出) - 並且不要亂用物理數據庫文件和用戶實例。在這種情況下,您的連接字符串將是這樣的:

    Data Source=.\\SQLEXPRESS;Database=Store;Integrated Security=True 
    

    和其他一切是正是像以前一樣...

另外:你應該SQL注入閱讀並更改您的代碼避免 - 它是適用於應用的#1的安全風險。您應該在ADO.NET中使用參數化查詢,而不是 - 這些都是安全的,而且它們也更快!

+0

Thanq回答,是的,似乎。\ bin \ debug中的.mdf具有所有數據,但我無法得到它或查看它(請參閱我的代碼中的button2),而第二種方法實際上並不喜歡安裝SSMS,因爲它需要我在客戶端進行物理呈現,而不是我想發送包。 –