无法在数据库中创建新记录;无错误信息

本文关键字:新记录 无错误 信息 创建 数据库 | 更新日期: 2023-09-27 18:15:15

我试图添加新的记录到trans_daily表,然而,下面的代码片段执行按钮单击不起作用。

问题代码

    private void button1_Click(object sender, EventArgs e)
    {
     try
     {
        SqlConnection connection = new SqlConnection(conString);
        connection.Open();
        string strcom = "INSERT INTO trans_daily (retail_id, cust_name, quantity, " +
        "price, date, visibility, remarks_id) VALUES (@RetailID, @CustomerName, " +
        "@Quantity, @Price, @Date, @Visibility, @RemarksID)";
        SqlCommand cmd = new SqlCommand(strcom, connection);
        cmd.Parameters.AddWithValue("@RetailID", ddRetailType.SelectedValue);
        cmd.Parameters.AddWithValue("@CustomerName", tbCustomer.Text);
        cmd.Parameters.AddWithValue("@Quantity", float.Parse(tbQuantity.Text));
        cmd.Parameters.AddWithValue("@Price", float.Parse(tbPrice.Text));
        cmd.Parameters.AddWithValue("@Date", DateTime.Now);
        cmd.Parameters.AddWithValue("@Visibility", 1);
        cmd.Parameters.AddWithValue("@RemarksID", 1);
        cmd.ExecuteNonQuery();
     }
     catch (Exception err)
     {
        Console.WriteLine(err.Message);
     }
  }

数据类型如下:
  1. retail_id (int)


  2. 价格(浮动)
  3. date (datetime)
  4. visibility (int)
  5. remarks_id (int)

还值得指出的是,正在抛出no异常。

哪里出了问题?


工作代码
在一个单独的函数中,我能够在表单加载时从retail表中取出数据,并将取出的数据放在下拉列表中。

    private void formAddTransaction_Load(object sender, EventArgs e)
    {
        try
        {
            objConnect = new DatabaseConnection();
            conString = Properties.Settings.Default.MVGasConnectionString;
            objConnect.Sql = "SELECT * FROM retail";
            objConnect.connection_string = conString;
            ds = objConnect.GetConnection;
            MaxRows = ds.Tables[0].Rows.Count;
            FillRetailTypes(conString);
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message);
        }
    }
    public void FillRetailTypes(string constring)
    {
        ddRetailType.DataSource = ds.Tables[0];
        ddRetailType.ValueMember = "id";
        ddRetailType.DisplayMember = "type";
    }

无法在数据库中创建新记录;无错误信息

试试这段代码,你可能会发现你的错误:

try
{
    using(SqlConnection connection = new SqlConnection(conString))
    using(SqlCommand cmd = new SqlCommand())
    {
        connection.Open();
        string strcom = "INSERT INTO trans_daily ([retail_id], [cust_name], [quantity], " +
    "[price], [date], [visibility], [remarks_id]) VALUES (@RetailID, @CustomerName, " +
    "@Quantity, @Price, @Date, @Visibility, @RemarksID)";
        cmd.CommandText = strcom;
        cmd.Connection = connection;
        cmd.Parameters.AddWithValue("@RetailID", SqlDbType.Int);
        cmd.Parameter["@RetailID"].Value = ddRetailType.SelectedValue;
        cmd.Parameters.AddWithValue("@CustomerName", SqlDbType.VarChar);
        cmd.Parameter["@CustomerName"].Value = tbCustomer.Text;
        cmd.Parameters.AddWithValue("@Quantity", SqlDbType.Float);
        cmd.Parameter["@Quantity"].Value = float.Parse(tbQuantity.Text);
        cmd.Parameters.AddWithValue("@Price", SqlDbType.Float);
        cmd.Paramter["@Price"].Value = float.Parse(tbPrice.Text);
        cmd.Parameters.AddWithValue("@Date", SqlDbType.DateTime);
        cmd.Parameter["@Date"].Value = DateTime.Now;
        cmd.Parameters.AddWithValue("@Visibility", SqlDbType.Int);
        cmd.Parameter["@Visibility"].Value = 1;
        cmd.Parameters.AddWithValue("@RemarksID", SqlDbType.Int);
        cmd.Parameter["@RemarksID"].Value = 1;
        int affectedRows = cmd.ExecuteNonQuery();
        Console.WriteLine("You have inserted {0} rows", affectedRows);
    }
}
catch(Exception e)
{
    Console.WriteLine(e.Message);
}

此代码将…

  • …自动打开和关闭数据库连接和命令对象

  • …将数据库中受影响的行数量记录到控制台

  • …将异常消息记录到控制台。如果您想看到整个异常(如果发生了),可以在该行添加一个断点

正如本博客所解释的,问题似乎出在连接字符串上。

在项目文件夹中,创建了2个.mdf文件:一个在文件夹的根目录(我们称之为mdf_1),另一个在bin'Debug文件夹(我们称之为mdf_2)。

现在,看看Visual Studio (VS)编辑器内部,显示了2个.mdf文件:一个在服务器资源管理器下,另一个在解决方案资源管理器下。没有注意到这些.mdf文件的位置(从属性部分)使我认为这2个.mdf文件是相同的。问题是,服务器资源管理器下的是mdf_1,而解决方案资源管理器下的是mdf_2

VS有一个行为,每次程序运行时复制mdf_1并覆盖mdf_2(因为默认情况下,.mdf被设置为Copy always mdf_1mdf_2)。我的连接字符串指向mdf_2,这解释了为什么尽管cmd.ExecuteNonQuery()命令返回1,但由于VS的行为,我成功插入的记录总是被擦除。因为它是mdf_1是在服务器资源管理器下,我无法验证DB的变化。简单地说,我在mdf_2中进行更改,同时试图查找mdf_1中的更改。

因此,为了避免这种情况,我通过将连接字符串中的相对路径|DataDirectory|更改为mdf_1的绝对路径来修改我的连接字符串,这样无论VS覆盖mdf_2的频率有多高,我在mdf_1运行时所做的更改都不会被覆盖。也就是说,更改也会反映在服务器资源管理器中(我在这里验证是否实际进行了更改)。


tl;dr:我在运行时更新bin'Debug文件夹下的.mdf文件,而物理地寻找位于项目根目录下的.mdf文件中的更新。