无法使用DataAdapter运行存储过程

时间:2014-11-12 06:49:06

标签: c# sql .net

我是ADO.net的新手。我有学生表,ID,姓名和地址为列。 ID是主键并设置为自动增量。我写了下面的存储过程

Create PROCEDURE [dbo].[InsertStudent]
  @_Name nvarchar(15),
  @_address nvarchar(45)
AS
INSERT INTO Student (Name, Address) VALUES(@_Name, @_address);

Go.

为了运行这个存储过程,我写了下面的方法

private static void RunStoredProcedure()
{
    using (SqlConnection connection = new SqlConnection("data source=server_name;initial      catalog=TestDB;trusted_connection=true"))
    {

        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Student", connection);

        adapter.InsertCommand = new SqlCommand("InsertStudent", connection);
        adapter.InsertCommand.CommandType = CommandType.StoredProcedure;


        adapter.InsertCommand.Parameters.Add("@_Name", SqlDbType.NChar, 15, "Name").Value = "John";
        adapter.InsertCommand.Parameters.Add("@_address", SqlDbType.NChar, 45, "Address").Value = "Paris";

        DataTable students = new DataTable();

        adapter.Fill(students);

        adapter.Update(students);
    }
}

不幸的是,在运行此方法后没有插入行。 如果我使用ExcecuteNonQuery()运行类似的代码,它工作正常。请帮我解决这个问题,因为我只想使用DataAdapter的Update()方法。

1 个答案:

答案 0 :(得分:0)

而不是:

adapter.InsertCommand.Parameters.Add("@_Name", SqlDbType.NChar, 15, "Name").Value = "John";
adapter.InsertCommand.Parameters.Add("@_address", SqlDbType.NChar, 45, "Address").Value = "Paris";

在调用SqlDataAdapter的Update函数之前,您必须向DataTable添加新行

using (SqlConnection connection = new SqlConnection(@"Data Source=LAPTOP\SQLEXPRESS;initial catalog=SO;trusted_connection=true"))
{
   SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Student", connection);

   adapter.InsertCommand = new SqlCommand("InsertStudent", connection);
   adapter.InsertCommand.CommandType = CommandType.StoredProcedure;

   adapter.InsertCommand.Parameters.Add("@_Name", SqlDbType.NChar, 15, "Name");
   adapter.InsertCommand.Parameters.Add("@_address", SqlDbType.NChar, 45, "Address");

   DataTable students = new DataTable();

   adapter.Fill(students);

   // Add a new row.
   DataRow sRow = students.NewRow();
   sRow["Name"] = "John";
   sRow["Address"] = "Paris";
   students.Rows.Add(sRow);

   adapter.Update(students);
 }

请查看here,了解您要尝试做的工作示例。

调用Update方法后,SQL数据适配器对象执行SQL INSERT,UPDATE和DELETE命令(由InsertCommand,UpdateCommand和DeleteCommand属性指定),以持久化DataTable对数据库的更改

因此,如果已将新行添加到DataTable,则会执行相应的SQL INSERT命令。在这种情况下,insert命令是一个sproc。所有DataTable字段都映射到相应的sproc参数,然后执行sproc。最终在数据库表中添加了一个新行。