2011-11-21 74 views
2

我正在寫一個方法插入一個學生到一個包含有關學生信息表中的本地SQL數據庫,將數據插入SQL數據庫:無法使用C#

public void AddStudent(string name, string teachName, string pass) 
{ 
    string dbfile = new System.IO.FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).DirectoryName + "\\Logo.sdf"; 
    SqlCeConnection connection = new SqlCeConnection("Data Source=" + dbfile + "; Password = 'dbpass2011!'"); 
    connection.Open(); 

    SqlCeTransaction transaction = connection.BeginTransaction(); 
    SqlCeCommand command = connection.CreateCommand(); 
    command.Transaction = transaction; 
    command.CommandText = "INSERT INTO Students VALUES ('@name', '@id', '@pass', '@tname')"; 
    command.Parameters.Add("@name", name); 
    command.Parameters.Add("@id", this.ID); 
    command.Parameters.Add("@pass", MD5Encrypt.MD5(pass)); 
    command.Parameters.Add("@tname", teachName); 


    command.Prepare(); 
    command.ExecuteNonQuery(); 
    transaction.Commit(); 
    connection.Dispose(); 
    connection.Close(); 
} 

每當我用這個,它永遠不會當我查看數據庫中的學生表的內容時,將數據插入到表中。最初我有這個返回一個int,所以我可以看到它影響了多少行,它總是返回1,所以我知道它正在工作。

我在尋找這個問題的答案,對類似問題的回答是那個人問的是看錯了.sdf文件。我確定我正在查看正確的文件。

任何反饋將不勝感激!

+0

解決了我的問題。顯然,MSVS每次構建解決方案時都會將頂級sdf文件複製到bin \ Debug文件夾中。因此,如果我希望我的程序運行時所做的更改得到保存,則必須在重建解決方案之前將頂級sdf設置爲bin \ Debug文件夾中的一個。 – user1057068

回答

2

最有可能在您的代碼中引發異常;您需要添加一個try/catch處理程序和/或調試應用程序以確定發生了什麼。

然而,至少有兩個問題與您的代碼:

你打電話前準備,指定每個參數的數據類型在聲明中做好準備。對於具有可變長度數據類型的每個參數,必須將Size屬性設置爲所需的最大大小。如果這些條件未得到滿足,則Prepare返回一個錯誤。

  • 您需要關閉處置它之前的連接(這不會影響插入,不過)。
+0

謝謝!然後我需要改變準備。我注意到我在發佈之後切換了Dispose和Close,所以也被修復了。 – user1057068

4
command.CommandText = "INSERT INTO Students VALUES ('@name', '@id', '@pass', '@tname')"; 

您應該刪除多餘的單引號 - 這應該是:

command.CommandText = "INSERT INTO Students VALUES (@name, @id, @pass, @tname)"; 

而且我不知道爲什麼你對單個插入打開一個交易 - 這也是沒有必要的。

+0

如果所有字段都是字符串呢?然後需要單引號。 – kol

+1

不需要參數化查詢,即使字段是字符串 - 事實上,您將插入字符串「@ name''而不是參數」@ name「的值 – BrokenGlass

+0

感謝您的信息。 – kol

2

你並不需要把單引號參數化查詢,參數化中的查詢情況下所需的全部數據將被解析,

command.CommandText = "INSERT INTO Students VALUES (@name, @id, @pass, @tname)"; 

而且,它能夠更好地設置參數類型,大小和值明確如下:

SqlCeParameter param = new SqlCeParameter("@name", SqlDbType.NVarChar, 100); 
param.Value = name; // name is a variable that contain the data of name field 
//param.Value = 'Jhon Smith'; //Directly value also can be used 

希望這將是有益的,謝謝你的時間。

+0

好的意見,但這不能回答這個問題。 – vidstige