无法为数据库创建新记录;没有错误消息

时间:2016-10-27 05:25:57

标签: c# sql

我尝试将新记录添加到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. cust_name(varchar50)
  3. 数量(浮动)
  4. 价格(浮动)
  5. 日期(日期时间)
  6. visibility(int)
  7. remarks_id(int)
  8. 还值得指出的是,没有异常被抛出。

    可能出了什么问题?

    工作代码
    在一个单独的函数中,我能够在表单加载时从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";
        }
    

2 个答案:

答案 0 :(得分:0)

尝试使用此代码,您可能会发现错误:

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);
}

此代码将......

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

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

  • ...将异常消息记录到控制台。如果要查看整个异常(如果发生),可以在此行中添加断点

答案 1 :(得分:0)

this blog中所述,似乎问题出在连接字符串中。

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

现在,在Visual Studio(VS)编辑器中查看,显示了2个.mdf个文件:一个在Server Explorer下,另一个在Solution Explorer下。没有注意到这些.mdf文件的位置(来自属性部分)让我觉得这两个.mdf文件是相同的。问题是,Server Explorer下的那个是mdf_1,而mdf_2是解决方案资源管理器下的那个。

VS的行为会在每次运行程序时复制mdf_1并覆盖mdf_2(因为默认情况下,.mdf设置为始终复制 {{ 1}}到mdf_1)。我的连接字符串指向mdf_2,这解释了为什么尽管mdf_2命令返回1,但由于VS具有的行为,我的成功插入记录总是被删除。由于它是cmd.ExecuteNonQuery()在服务器资源管理器下,我无法验证数据库中的更改。简而言之,我正在mdf_1中进行更改,同时尝试在mdf_2中查找更改。

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

tl; dr :我在运行时期间更新mdf_1文件夹下的.mdf文件,同时在bin\Debug文件中查找更新项目的根源。