将语句插入SQL Server数据库

时间:2013-02-14 15:07:41

标签: c# sql-server database sql-server-2012

我试图在过去几天找到这个错误,但没有任何成功。

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

我的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时,没有新行。此外,当我尝试刷新此表数据时,visual studio(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)
);

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

2 个答案:

答案 0 :(得分:4)

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

  1. 插入成功。
  2. 你得到例外。
  3. 您有一个触发器,可以用其他一些操作替换插入。
  4. 我猜你没有触发器,因为你没有在表中获得记录,所以必须有例外。

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

    使用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;
    

答案 1 :(得分:2)

我会尝试在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();
}