使用C#WPF和SQL添加行时自动增加值

时间:2014-05-07 19:27:53

标签: c# sql sql-server wpf

我在Visual Studio Express 2012中使用C#WPF。我已经创建了一个基于本地服务的数据库(.mdf数据库)。

我已经用

创建了一个表格
    CREATE TABLE [dbo].[Scenes] (
         [id]              INT           IDENTITY (1, 1) NOT NULL,
         [Planning_period] NVARCHAR (50) NOT NULL,
         [Scene_name]      NVARCHAR (50) NOT NULL,
         PRIMARY KEY CLUSTERED ([id] ASC)
    );

我希望能够添加新行,但以下代码不起作用,因为我将id保留为null。如何在添加数据时自动增加它?

    SqlConnection cn = new SqlConnection(global::WaterfowlModel.Properties.Settings.Default.WAMConnectionString);
    try
    {
        string sql = "INSERT INTO Scenes (Planning_period, Scene_name) Values ('" + working_plan + "','" + Create_plan_txt.Text +"')";
        SqlCommand cmd = new SqlCommand(sql, cn);
        cn.Open();
        cmd.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
    }
    finally
    {
        cn.Close();
    }

谢谢!

修改

我也尝试使用存储过程并收到相同的错误。

CREATE PROCEDURE [dbo].[Add_Scene]
    @param1 nvarchar(50),
    @param2 nvarchar(50)
AS
    INSERT INTO Scenes(Planning_period, Scene_name)
    VALUES(@param1, @param2)

和代码:

        string sql = "Add_Scene";
        SqlCommand cmd = new SqlCommand(sql, cn);
        SqlParameter planname = new SqlParameter("@param1", working_plan);
        SqlParameter scenename = new SqlParameter("@param2", Create_plan_txt.Text);

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(planname);
        cmd.Parameters.Add(scenename);
        cn.Open();
        cmd.ExecuteNonQuery();

3 个答案:

答案 0 :(得分:0)

首先,您应该小心使用该代码,您应该为sqlCommand使用参数,而不是连接...

要使用数据库,您应该看到如何进行调用,而不是使用sql Insert语句,而是调用存储过程,在表上插入记录,并保存Insert语句。

如此恢复,如果你看到我怎么做我回答你的问题,你会发现,一旦你的存储过程正常工作,你就可以毫无后顾之力地进行自动增量;)。

你赢了所有,因为你的代码将更加强大,安全和可靠。

问候。

答案 1 :(得分:0)

我按照Create stored procedure to add with auto increment as its primary field?

的说明进行操作

我必须做的一件事是在启动应用程序之前重建解决方案。在我重建之前,它没有用。

答案 2 :(得分:0)

根据你所做的改变,你只需要在插入后的存储过程中返回ID,你有办法解决这个问题,但要小心...

如果您的数据库中没有大量流量,您可以使用此更快的速度:

CREATE PROCEDURE [dbo].[Add_Scene]
    @param1 nvarchar(50),
    @param2 nvarchar(50)
AS
BEGIN
    INSERT INTO Scenes(Planning_period, Scene_name)
    VALUES(@param1, @param2)

    RETURN @@IDENTITY
END

这是此类存储过程的标准,您可以在此处看到:http://technet.microsoft.com/en-us/library/ms187342.aspx。但是,如果您在具有大量数据库流量的环境中工作,此函数可能无法返回正确的值,它只返回上一次Insert操作的ID,如果存在并发,则可能存在问题,因此请检查其他选项,执行速度可能较慢但更可靠。

主要的一点是在插入后从数据库返回ID自动递增,这样你就可以读取你所做插入的值。

希望这会对你有所帮助。

问候。