将语句插入SQL Server数据库

本文关键字:Server 数据库 SQL 插入 语句 | 更新日期: 2023-09-27 17:59:24

过去几天我一直在努力寻找这个bug,但没有成功。

我正试图在数据库中插入一个新行。一切都很顺利:没有错误,也没有程序崩溃。

我的INSERT语句如下:

INSERT INTO Polozaj(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek)
VALUES(1,1,1,1,1,1)

该语句是可以的,因为当我在数据库中运行查询时,它会添加新行。

我的C#代码如下:

string connection = @"Data Source=(LocalDB)'v11.0;AttachDbFilename=" + Application.StartupPath + "''Trgovina.mdf;Integrated Security=True";
SqlConnection cn = new SqlConnection(connection);
string payment = ((Button)sender).Text, maxID = string.Empty;
double discount = Convert.ToDouble(discauntText.Text), totalPrice = Convert.ToDouble(fullPriceText.Text), fullPrice = Convert.ToDouble(discountPriceText.Text);
switch (payment)
{
    case "Dobavnica": discount = 10; break;
    case "Kartica": discount = 0; break;
    case "Gotovina": discount = 5; break;
}
cn.Open();
SqlCommand maxIdCmd = new SqlCommand("SELECT MAX(Id_racuna) FROM Racun", cn);
maxID = Convert.ToString(maxIdCmd.ExecuteScalar());
maxID = maxID != "" ? Convert.ToString(Convert.ToInt32(maxID) + 1) : "1";
string stmt = "INSERT INTO Racun(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) " + 
              "VALUES(@Price, @User, @Time, @Customer, @Discount, @FullPrice)";
SqlCommand cmd = new SqlCommand(stmt, cn);
cmd.ExecuteNonQuery();
cn.Close();

正如我已经提到的,看起来程序运行这个查询,一切都很正常,但当我查看表Racun时,没有新行。此外,当我尝试刷新这个表时,visualstudio(2012)给了我一个错误,看起来像:This database cannot be imported. It is either unsupported SQL Server version or an unsupported database compatibility.

我的表Racun创建查询如下所示:

CREATE TABLE [dbo].[Racun] (
   [Id_racuna]   INT             IDENTITY (1, 1) NOT NULL,
   [Znesek]      NUMERIC (10, 3) NULL,
   [Uporabnik]   NCHAR (20)      NULL,
   [Cas]         NCHAR (15)      NULL,
   [Kupec]       NCHAR (10)      NULL,
   [Popust]      NUMERIC (10, 3) NULL,
   [Poln_znesek] NUMERIC (10, 3) NULL,
   PRIMARY KEY CLUSTERED ([Id_racuna] ASC)
);

我不知道出了什么问题。有人能帮忙吗?

将语句插入SQL Server数据库

这样的插入有三种可能的情况:

  1. 插入成功
  2. 你会得到一个例外
  3. 您有一个触发器,可以用其他操作替换插入

我想你没有触发器,而且由于表中没有记录,所以一定会有一个例外。

您是否有任何代码可以在任何其他级别捕获异常?这可以解释为什么你看不到它,也可以解释为什么数据库连接没有关闭,这可以解释你之后连接到数据库时遇到问题。

对数据库连接使用using块可以正确地关闭它,即使代码中有错误。

您使用的是参数化查询,但我看不出您在代码中的任何位置都将参数添加到命令对象中。这将类似于:

cmd.Parameters.Add("Price", SqlDbType.Decimal).Value = price;
cmd.Parameters.Add("User", SqlDbType.NChar, 20).Value = user;
cmd.Parameters.Add("Time", SqlDbType.NChar, 15).Value = time;
cmd.Parameters.Add("Customer", SqlDbType.NChar, 10).Value = customer;
cmd.Parameters.Add("Discount", SqlDbType.Decimal).Value = discount;
cmd.Parameters.Add("FullPrice", SqlDbType.Decimal).Value = fullPrice;

我会尝试将您的代码包装在try块中,看看是否可以捕获SqlExecption:

try {
    SqlCommand cmd = new SqlCommand(stmt, cn);
    cmd.ExecuteNonQuery();
} catch (SqlException ex) {
    Console.WriteLine(ex.Message);
}

编辑:看起来您缺少INSERT语句的参数,您可能应该考虑使用SqlTransaction:

SqlCommand maxIdCmd = new SqlCommand("SELECT MAX(Id_racuna) FROM Racun", cn);
maxID = Convert.ToString(maxIdCmd.ExecuteScalar());
maxID = maxID != "" ? Convert.ToString(Convert.ToInt32(maxID) + 1) : "1";
string stmt = "INSERT INTO Racun(Znesek, Uporabnik, Cas, Kupec, Popust, Poln_znesek) " + 
              "VALUES(@Price, @User, @Time, @Customer, @Discount, @FullPrice)";
SqlCommand cmd = new SqlCommand(stmt, cn);
// Adding parameters to the insert statement:
cmd.Parameters.AddWithValue("@Price", price);
cmd.Parameters.AddWithValue("@User", user);
cmd.Parameters.AddWithValue("@Time", time);
cmd.Parameters.AddWithValue("@Customer", customer);
cmd.Parameters.AddWithValue("@Discount", discount);
cmd.Parameters.AddWithValue("@FullPrice", fullprice);
// Start a transaction so we can roll back if there's an error:
SqlTransaction transaction = cn.BeginTransaction();
cmd.Transaction = transaction;
try {
    cmd.ExecuteNonQuery();
    transaction.Commit();
} catch (SqlException ex) {
    transaction.Rollback();
    Console.WriteLine(ex.Message);
} finally {
    cn.Close();
}