2014-05-12 62 views
1

我會參加ac#比賽,我需要離線處理數據庫,他們應該在每臺PC上工作,所以如果有人複製我的項目並運行我的程序,將工作相同。本地數據庫不會顯示我的programmaticaly添加表

我用Add - New Item創建了一個本地數據庫並創建了我的數據庫。

我的代碼

private void Form1_Load(object sender, EventArgs e) 
{ 
    SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.bazalocalaConnectionString); 
    con.Open(); 
    SqlCeCommand com = new SqlCeCommand("select * from Tabela",con); 
    SqlCeDataReader r = com.ExecuteReader(); 
    while (r.Read()) 
    { 
     MessageBox.Show(r["nume"].ToString()); 
    } 
     com = new SqlCeCommand("create table taby(id int identity(1,1) primary key,nume nvarchar(10),prenume nvarchar(10))", con); 
    com.ExecuteNonQuery(); 
    con.Close(); 
} 

我所擁有的,我創建後,我的表,並關閉程序,我的新表將不會在我的服務器資源管理器中存在的問題。爲什麼會這樣? 我做錯了嗎?

如果我這樣工作,它會在每臺PC上運行嗎?

我的連接字符串是由Visual Studio生成,當我創建我的本地數據庫自動它是

Data Source=|DataDirectory|\bazalocala.sdf 
+2

如果查詢成功執行,表格將始終存在。你在服務器資源管理器中刷新了嗎?它可能被緩存 – Dhawalk

+1

你的問題是你正在你的'Form1_Load()'事件處理程序中以編程方式添加表。使用Server Explorer添加它。 –

+1

請顯示您的連接字符串。你在使用| DataDirectory | ? – Steve

回答

2

替換字符串|DataDirectory|是由你的程序運行的目錄替換。
在Visual Studio調試會話期間,此目錄是BIN \ DEBUG(或x86變體)。
因此,您的表格被添加到位於BIN \ DEBUG文件夾中的數據庫中,而您的服務器瀏覽器窗口具有指向位於項目文件夾中的數據庫的連接。

您可以嘗試添加另一個指向BIN \ DEBUG文件夾中的數據庫的連接,您將能夠看到您的表。

如果你在VS外運行你的程序,那麼你就沒有這個問題。

使事情進一步複雜化的是您的SDF文件的屬性Copy to output directory。如果此屬性設置爲Copy Always,那麼每次啓動調試會話時,都會將SDF文件從項目文件夾複製到BIN \ DEBUG文件夾,從而有效地覆蓋文件以及您在前一個調試會話中所做的更改。您應該將此屬性更改爲Copy if Newer

+0

我試圖添加一個新的連接到我的.sdf文件從調試,我得到的錯誤'試圖附加一個自動命名的數據庫的文件C:/ ....失敗的數據庫具有相同的名稱存在或指定的文件無法打開 –

+0

我不明白。代碼是正確的。你添加一個新的連接到服務器資源管理器,只是爲了檢查你的表是否存在,它並不是真的需要你的代碼工作。 – Steve

+0

什麼代碼是正確的?無論如何,我擔心在比賽中我會去,測試我的程序的人將使用F5將一些數據添加到我的數據庫,當他再次執行所有他以編程方式添加的內容時不會在那裏。 –

1

你可以嘗試這樣的

try 
    { 
     SqlCeConnection con = new SqlCeConnection(Properties.Settings.Default.bazalocalaConnectionString); 
     con.Open(); 
     // 
     // The following code uses an SqlCommand based on the SqlConnection. 
     // 
     using (SqlCeCommandcommand = new SqlCeCommand("CREATE TABLE taby(id int identity(1,1) primary key,nume nvarchar(10),prenume nvarchar(10));", con)) 
      { 
       command.ExecuteNonQuery(); 
      } 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
+1

這是我的代碼相同,但寫入不同.. –

+1

不,這是不一樣的。這是完全錯誤的。當您使用SqlCeConnection和SqlCeCommand時,它使用SqlConnection和SqlCommand。 Sql Server類不能使用SDF文件 – Steve

+0

@Steve是對的我已更新 – yaadgar

2

當您使用| DataDirectory目錄|並在Visual Studio中編譯程序,Visual Studio會在Debug文件夾中創建一個與原始數據庫不同的臨時數據庫。這就是爲什麼添加的表不會顯示在那裏,而不是| DataDirectory |使用實際的地址。

0
SqlCeConnection con = new SqlCeConnection("Data Source=K:/PROJECT LOCATION/Database1.sdf"); 

con.Open();   
string x = "insert into TABLE(your columns) values (what values you want)"; 
SqlCeCommand cmd = new SqlCeCommand(x, con); 
try 
{ 
    cmd.ExecuteNonQuery(); 
} 
catch 
{ 
    MessageBox.Show(" Something is wrong","ERROR!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
} 
con.Close(); 

我創建了一個連接,並給它一個數據庫的完整位置,而不是bin/debug中的一個。然後我打開連接並寫入字符串x以將該數據保存在我的數據庫中。我創建了一個新的命令,我在try-catch子句中進行了測試,最後我關閉了連接。

相關問題