2013-06-27 2 views
0

У меня есть следующий код и не обновляет запись в базе данных.SqlDataAdapter не будет обновлять запись

SqlDataAdapter da = new SqlDataAdapter("spInvent",cs); 
da.UpdateCommand.CommandType = System.Data.CommandType.StoredProcedure; 
da.UpdateCommand.Parameters.AddWithValue("@DisplayNo", displayNo); 
da.UpdateCommand.Parameters.AddWithValue("@Q", Q); 
da.UpdateCommand.ExecuteNonQuery(); 

DataSet ds = new DataSet(); 

da.Fill(ds); 
gvInfo.DataSource = ds; 
gvInfo.DataBind(); 

Я получаю ошибку здесь:

da.UpdateCommand.CommandType = System.Data.CommandType.StoredProcedure; 
+0

являются 'displayNo' или' Q' равно 'null'? – gunr2171

+0

У них есть значения. – Apollo

ответ

4

Правильный синтаксис:

using System.Data; 
using System.Data.Sql; 
using System.Data.SqlClient; 
using System.Configuration; 

SqlConnection cs = new 
SqlConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString); 
if (cs.State == ConnectionState.Closed) { 
    cs.Open(); 
} 
SqlCommand cmd = new SqlCommand(); 
cmd.Connection = cs; 
cmd.CommandText = "UpdateStoredProcedureName"; 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Parameters.AddWithValue("@DisplayNo", displayNo); 
cmd.Parameters.AddWithValue("@Q", Q); 
int result = cmd.ExecuteNonQuery(); 

if (result > 0) { 
    //Your Database is updated. To show it in gridview, you have 
    //to select the table and show its data. 
    SqlCommand cmd1 = new SqlCommand(); 
    cmd1.Connection = cs; 
    cmd1.CommandText = "SelectStoredProcedureName"; 
    cmd1.CommandType = CommandType.StoredProcedure; 
    cmd1.Parameters.AddWithValue("@displayId", 0); 

    //In the SelectStoredProcedure, use @displayId = 0 to 
    //show all rows. 

    SqlDataAdapter adpt = new SqlDataAdapter(); 
    adpt.SelectCommand = cmd1; 
    DataSet ds = new DataSet(); 
    adpt.Fill(ds); 
    cs.Close(); 
    GridViewID.DataSource = ds; 
    GridViewId.DataBind(); 
} else { 
    cs.Close(); 
} 
+0

SQLConnection используется для соединения. SqlCommand используется для выполнения запроса в базе данных. DataAdapter используется для извлечения значений из базы данных, а DataSet используется в качестве контейнера DataAdapter для хранения значений базы данных. –

+0

Как я могу отобразить это в моем gridview? – Apollo

+0

Ответ обновлен. Функция ExecuteNonQuery может только вставлять, обновлять или удалять из вашей таблицы, она не может ** Выберите ** строки из таблицы и покажите их. –

0

Я считаю, что ваша проблема в том, что вы не должны выполнить запрос, а затем заполнить свой набор данных, вы можете просто заполнить свой набор данных, так:

SqlDataAdapter da = new SqlDataAdapter(); 
//updated to explicitly create update command object 
SqlCommand update = new SqlCommand("spInvent",cs); 
update.CommandType = System.Data.CommandType.StoredProcedure; 
update.Parameters.AddWithValue("@DisplayNo", displayNo); 
update.Parameters.AddWithValue("@Q", Q); 
da.UpdateCommand = update; 
//don't need this line: 
//da.UpdateCommand.ExecuteNonQuery(); 

DataSet ds = new DataSet(); 

da.Fill(ds); 
gvInfo.DataSource = ds; 
gvInfo.DataBind(); 
+0

Я получаю сообщение об ошибке здесь. da.UpdateCommand.CommandType = System.Data.CommandType.StoredProcedure; – Apollo

+0

Я обновил свой ответ, чтобы явно создать команду обновления, а затем назначить ее адаптеру данных, попробуйте это. –

0

Несколько вещей здесь:

  1. Y ou не указывать фактические UpdateCommand. Конструктор для SqlDataAdapter устанавливает SelectCommand. вам нужно указать, какой sproc используется для обновления данных.
  2. Вам не нужно казнить SelectCommand или UpdateCommand непосредственно - DataAdapter будет делать это автоматически, когда вы используете его для заполнения DataSet или позвоните Update() на это (GridView может сделать это для вас, в зависимости от того, как подключить его вверх).