2017-01-16 164 views
1

我想写一个应用程序在Visual Studio C#写入基于服务的数据库。我遇到的问题是我没有收到任何错误,但是在重新启动应用程序后,没有任何内容保存到数据库中...C#基于服务的数据库不写入数据库

我知道这是因为它不允许重复主键。这几乎就像是一个临时数据库......如果是这种情况,我该如何让它成为一个持久的基于服务的数据库?

这里是我的代码:

private void button1_Click(object sender, EventArgs e) 
{ 
    try { 
     // Connection to DB 
     SqlConnection con = new SqlConnection(); 
     con.ConnectionString = (@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\MTR_Database.mdf;Integrated Security=True"); 

     // Insert Query 
     string insertquery = "INSERT INTO dbo.Job01 ([Item #], [Manufacturer], [Mill Location], [Product Description], [Weld Seam Type], [Outer Dimension], [Wall Thickness], [Coating], [Grade], [Heat], [ANSI/ASME], [Purchase Order], [Standard]) VALUES(@ItemNum, @Manufacturer, @MillLocation, @ProductDescription, @WeldSeamType, @OuterDimension, @WallThickness, @Coating, @Grade, @Heat, @ANSIASME, @PurchaseOrder, @Standard)"; 

     SqlCommand cmd = new SqlCommand(insertquery, con); 

     // open connection 
     con.Open(); 

     // Parameters 
     cmd.Parameters.AddWithValue("@ItemNum", item__TextBox.Text); 
     cmd.Parameters.AddWithValue("@Manufacturer", manufacturerTextBox.Text); 
     cmd.Parameters.AddWithValue("@MillLocation", mill_LocationTextBox.Text); 
     cmd.Parameters.AddWithValue("@ProductDescription", product_DescriptionTextBox.Text); 
     cmd.Parameters.AddWithValue("@WeldSeamType", weld_Seam_TypeTextBox.Text); 
     cmd.Parameters.AddWithValue("@OuterDimension", outer_DimensionTextBox.Text); 
     cmd.Parameters.AddWithValue("@WallThickness", wall_ThicknessTextBox.Text); 
     cmd.Parameters.AddWithValue("@Coating", coatingTextBox.Text); 
     cmd.Parameters.AddWithValue("@Grade", gradeTextBox.Text); 
     cmd.Parameters.AddWithValue("@Heat", heatTextBox.Text); 
     cmd.Parameters.AddWithValue("@ANSIASME", aNSI_ASMETextBox.Text); 
     cmd.Parameters.AddWithValue("@PurchaseOrder", purchase_OrderTextBox.Text); 
     cmd.Parameters.AddWithValue("@Standard", standardTextBox.Text); 

     // Execute 
     cmd.ExecuteNonQuery(); 

     // close connection 
     con.Close(); 
    } 
    catch (Exception ex) 
    { 
     // catch error 
     MessageBox.Show(ex.Message); 
    } 
} 

我真的不能把我的手指上正在发生的事情。

+0

我想更多,我希望它充当SQLite ...没有一个活动的服务器,并在应用程序内。在Visual Studio中嵌入SQL Express可能吗? – Mokey

+0

阅读此:http://stackoverflow.com/questions/6221951/sqlexception-catch-and-处理与SQL服务器的异常处理。也使用MDF的直接文件路径,看看会发生什么 –

回答

1

整个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,给它一个逻辑名称(例如MTR_Database

  4. 使用其逻辑数据库名称连接到它(在服务器上创建时给出) - 并且不要乱用物理数据库文件和用户实例。在这种情况下,您的连接字符串将是这样的:

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

    和其他一切是正是和以前一样......

另见阿龙贝特朗的优秀博客文章Bad habits to kick: using AttachDbFileName更多背景信息。

+0

将做@marc_s感谢您的信息...我会试试这个。我一直在MySql中工作很多,但试图切换到SQL工作......迄今为止,这是一个可怕的经历。除了这个事实,我会再次努力。如果它有效,我会Upvote的答案:)我可能明天就完成它,因为它几乎是时间去取下工作:( – Mokey

+1

你是完全正确的......我在看错误的DB文件,一切正常插入。我必须学习如何创建一个新的服务器并给它一个数据库名称,然后我可以把它看作是mySQL,我可能只是将它从服务器而不是本地运行。 – Mokey