我在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();
答案 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自动递增,这样你就可以读取你所做插入的值。
希望这会对你有所帮助。
问候。