none
Хранимая процедура для вставки и обновление данных RRS feed

  • Вопрос

  • Добрый день!!! Есть хранимая процедура:

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    go
    
    
    ALTER procedure [dbo].[proc_insertFor7]  
    @kodd char(11),
    @k_npu char(14),
    @k_ter char(5),
    @kstr int,
    @gr1 float,
    @gr2 float,
    @gr3 float,
    @gr4 float,
    @gr5 float,
    @gr6 float,
    @gr7 float,
    @gr8 float,
    @gr9 float,
    @gr10 float
    
    as
    begin
    declare @k_str int,
            @kod char(11)
    set @k_str = (select k_str from bok where k_str = @kstr)
    set @kod = (select kod from kat where kod = @kodd)
            if ((select count(id) from forma7 where k_str = @k_str and kod = @kod ) > 0)
    begin
    update forma7
    set gr1 = @gr1,
        gr2 = @gr2,
        gr3 = @gr3,
        gr4 = @gr4,
        gr5 = @gr5,
        gr6 = @gr6,
        gr7 = @gr7,
        gr8 = @gr8,
        gr9 = @gr9,
        gr10 = @gr10 
    where k_str = @k_str and kod = @kod
    end
    else
    begin
    insert forma7(kod,k_npu,k_ter,k_str,gr1,gr2,gr3,gr4,gr5,gr6,gr7,gr8,gr9,gr10)
    values (@kod,@k_npu,@k_ter,@k_str,@gr1,@gr2,@gr3,@gr4,@gr5,@gr6,@gr7,@gr8,@gr9,@gr10)
    end
    end 

    и с# код который вызывает эту процедуру, ниже указан блок из этого кода:

                    param = new SqlParameter();
                    param.ParameterName = "@kstr";
                    param.SqlDbType = SqlDbType.Char;
                    param.Direction = ParameterDirection.Input;
                    param.Value = dataGridView1.Rows[0].Cells[0].Value;
                    param.Value = dataGridView1.Rows[1].Cells[0].Value;
                    param.Value = dataGridView1.Rows[2].Cells[0].Value;
                    param.Value = dataGridView1.Rows[3].Cells[0].Value;
                    param.Value = dataGridView1.Rows[4].Cells[0].Value;
                    param.Value = dataGridView1.Rows[5].Cells[0].Value;
                    param.Value = dataGridView1.Rows[6].Cells[0].Value;
                    command.Parameters.Add(param);
    проблема в том что сажает только последнюю строчку т.е.   
    param.Value = dataGridView1.Rows[6].Cells[0].Value;

    подскажите где ошибка?

    23 августа 2012 г. 9:24

Ответы

Все ответы

  • в вашем коде на C# несколько ошибок

    вопервых у вас указанно что параметер kstr имеет тип int а вы пытаетесь передать Char

    далее каждое присвоение

    param.Value = dataGridView1.Rows[0].Cells[0].Value;

    просто перезаписывает значение параметра поэтому у вас и получается только последнее значение

    попробуйте переписать ваш код наподобии такого

     param = new SqlParameter();
                    param.ParameterName = "@kstr";
                    param.SqlDbType = SqlDbType.Char;
                    param.Direction = ParameterDirection.Input;
                    param.Value = dataGridView1.Rows[0].Cells[0].Value;
                    command.Parameters.Add(param);
    param = new SqlParameter();
                    param.ParameterName = "@gr1";
                    param.SqlDbType = SqlDbType.Char;
                    param.Direction = ParameterDirection.Input;
                    param.Value = dataGridView1.Rows[1].Cells[0].Value;
                    command.Parameters.Add(param);
    param = new SqlParameter();
                    param.ParameterName = "@gr2";
                    param.SqlDbType = SqlDbType.Char;
                    param.Direction = ParameterDirection.Input;
                    param.Value = dataGridView1.Rows[2].Cells[0].Value;
                    command.Parameters.Add(param);
    param = new SqlParameter();
                    param.ParameterName = "@gr3";
                    param.SqlDbType = SqlDbType.Char;
                    param.Direction = ParameterDirection.Input;
                    param.Value = dataGridView1.Rows[3].Cells[0].Value;
                    command.Parameters.Add(param);
    param = new SqlParameter();
                    param.ParameterName = "@gr4";
                    param.SqlDbType = SqlDbType.Char;
                    param.Direction = ParameterDirection.Input;
                    param.Value = dataGridView1.Rows[4].Cells[0].Value;
                    command.Parameters.Add(param);
    


    • Предложено в качестве ответа Abolmasov Dmitry 24 августа 2012 г. 7:19
    23 августа 2012 г. 9:40
  • в моем понимании в данном случае ROWS это строчка, а CELLS ячейки в них, у меня должно быть 7 строчек и 10 граф, попробовало как показано но выдает типа индекс за пределами или сажает индекс. 

    23 августа 2012 г. 10:46
  • Вам нужно в цикле проходить по всем записям в гриде и для каждой записи цыклом проходить по ячейкам и вставлять их в вызов процедуры? наподобие такого

    foreach (DataGridViewRow row in dataGridView1)
    {
      var param = new SqlParameter();
                    param.ParameterName = "@kstr";
                    param.SqlDbType = SqlDbType.Int;
                    param.Direction = ParameterDirection.Input;
                    param.Value = row.Cells[0].Value;
                    command.Parameters.Add(param);
    param = new SqlParameter();
                    param.ParameterName = "@gr1";
                    param.SqlDbType = SqlDbType.Double;
                    param.Direction = ParameterDirection.Input;
                    param.Value = row.Cells[1].Value;
                    command.Parameters.Add(param);
    param = new SqlParameter();
                    param.ParameterName = "@gr2";
                    param.SqlDbType = SqlDbType.Double;
                    param.Direction = ParameterDirection.Input;
                    param.Value = row.Cells[2].Value;
                    command.Parameters.Add(param);
    ......
    }

    23 августа 2012 г. 11:12
  • Покажите визуально таблицу, скриншот или схему ее, чтобы было понятно какие данные вы хотите вставить. Индексы как сказали лучше получать в цикле и проверить их руками. Если нет 6го индекса - значит в таблице у вас нет такой строки (7ой по счету).


    Для связи [mail]

    24 августа 2012 г. 7:20
  • вот форма ввода данных в базу. Где k_str это код строки а набранные данные это с отчета (примерно). Режим Сохранить должен вызвать след. код:

    private void button1_Click_1(object sender, EventArgs e) { using (SqlConnection conn = new SqlConnection(conStr)) { conn.Open(); SqlCommand command = new SqlCommand("dbo.proc_insertFor7", conn); command.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param = new SqlParameter(); param.ParameterName = "@kodd"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = textBox1.Text; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@k_npu"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = textBox2.Text; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@k_ter"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = textBox3.Text; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@kstr"; param.SqlDbType = SqlDbType.Int; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[0].Value; param.Value = dataGridView1.Rows[1].Cells[0].Value; param.Value = dataGridView1.Rows[2].Cells[0].Value; param.Value = dataGridView1.Rows[3].Cells[0].Value; param.Value = dataGridView1.Rows[4].Cells[0].Value; param.Value = dataGridView1.Rows[5].Cells[0].Value; param.Value = dataGridView1.Rows[6].Cells[0].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr1"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[1].Value; param.Value = dataGridView1.Rows[1].Cells[1].Value; param.Value = dataGridView1.Rows[2].Cells[1].Value; param.Value = dataGridView1.Rows[3].Cells[1].Value; param.Value = dataGridView1.Rows[4].Cells[1].Value; param.Value = dataGridView1.Rows[5].Cells[1].Value; param.Value = dataGridView1.Rows[6].Cells[1].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr2"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[2].Value; param.Value = dataGridView1.Rows[1].Cells[2].Value; param.Value = dataGridView1.Rows[2].Cells[2].Value; param.Value = dataGridView1.Rows[3].Cells[2].Value; param.Value = dataGridView1.Rows[4].Cells[2].Value; param.Value = dataGridView1.Rows[5].Cells[2].Value; param.Value = dataGridView1.Rows[6].Cells[2].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr3"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[3].Value; param.Value = dataGridView1.Rows[1].Cells[3].Value; param.Value = dataGridView1.Rows[2].Cells[3].Value; param.Value = dataGridView1.Rows[3].Cells[3].Value; param.Value = dataGridView1.Rows[4].Cells[3].Value; param.Value = dataGridView1.Rows[5].Cells[3].Value; param.Value = dataGridView1.Rows[6].Cells[3].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr4"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[4].Value; param.Value = dataGridView1.Rows[1].Cells[4].Value; param.Value = dataGridView1.Rows[2].Cells[4].Value; param.Value = dataGridView1.Rows[3].Cells[4].Value; param.Value = dataGridView1.Rows[4].Cells[4].Value; param.Value = dataGridView1.Rows[5].Cells[4].Value; param.Value = dataGridView1.Rows[6].Cells[4].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr5"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[5].Value; param.Value = dataGridView1.Rows[1].Cells[5].Value; param.Value = dataGridView1.Rows[2].Cells[5].Value; param.Value = dataGridView1.Rows[3].Cells[5].Value; param.Value = dataGridView1.Rows[4].Cells[5].Value; param.Value = dataGridView1.Rows[5].Cells[5].Value; param.Value = dataGridView1.Rows[6].Cells[5].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr6"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[6].Value; param.Value = dataGridView1.Rows[1].Cells[6].Value; param.Value = dataGridView1.Rows[2].Cells[6].Value; param.Value = dataGridView1.Rows[3].Cells[6].Value; param.Value = dataGridView1.Rows[4].Cells[6].Value; param.Value = dataGridView1.Rows[5].Cells[6].Value; param.Value = dataGridView1.Rows[6].Cells[6].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr7"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[7].Value; param.Value = dataGridView1.Rows[1].Cells[7].Value; param.Value = dataGridView1.Rows[2].Cells[7].Value; param.Value = dataGridView1.Rows[3].Cells[7].Value; param.Value = dataGridView1.Rows[4].Cells[7].Value; param.Value = dataGridView1.Rows[5].Cells[7].Value; param.Value = dataGridView1.Rows[6].Cells[7].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr8"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[8].Value; param.Value = dataGridView1.Rows[1].Cells[8].Value; param.Value = dataGridView1.Rows[2].Cells[8].Value; param.Value = dataGridView1.Rows[3].Cells[8].Value; param.Value = dataGridView1.Rows[4].Cells[8].Value; param.Value = dataGridView1.Rows[5].Cells[8].Value; param.Value = dataGridView1.Rows[6].Cells[8].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr9"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[9].Value; param.Value = dataGridView1.Rows[1].Cells[9].Value; param.Value = dataGridView1.Rows[2].Cells[9].Value; param.Value = dataGridView1.Rows[3].Cells[9].Value; param.Value = dataGridView1.Rows[4].Cells[9].Value; param.Value = dataGridView1.Rows[5].Cells[9].Value; param.Value = dataGridView1.Rows[6].Cells[9].Value; command.Parameters.Add(param); param = new SqlParameter(); param.ParameterName = "@gr10"; param.SqlDbType = SqlDbType.Char; param.Direction = ParameterDirection.Input; param.Value = dataGridView1.Rows[0].Cells[10].Value; param.Value = dataGridView1.Rows[1].Cells[10].Value; param.Value = dataGridView1.Rows[2].Cells[10].Value; param.Value = dataGridView1.Rows[3].Cells[10].Value; param.Value = dataGridView1.Rows[4].Cells[10].Value; param.Value = dataGridView1.Rows[5].Cells[10].Value; param.Value = dataGridView1.Rows[6].Cells[10].Value; command.Parameters.Add(param);

    command.ExecuteNonQuery(); conn.Close(); } }

    а этот код соответственно должен выполнить хранимую процедуру которая была показана в самом начале темы. И в конце в базу должен садится все данные (7 строк и 10 граф) которые выделено зеленным на рисунке не зависимо от того есть там данные или нет.  Но у меня с данной процедурой и кодом сажает только последнюю строчку, а остальных просто игнорирует. Что я делаю не так?  
     
    27 августа 2012 г. 4:21
  • Как я и писал в самом начале как вы пытаетесь сделать не получится у вас будет сохранятся только последняя строка, в параметер передается только 1 значение а не массив, перепешите код вот так

    private void button1_Click_1(object sender, EventArgs e)
    		{
    			using (SqlConnection conn = new SqlConnection(conStr))
    			{
    				conn.Open();
    				foreach (var row in dataGridView1.Rows)
    				{
    					SqlCommand command = new SqlCommand("dbo.proc_insertFor7", conn);
    					command.CommandType = CommandType.StoredProcedure;
    					SqlParameter param = new SqlParameter();
    					param = new SqlParameter();
    					param.ParameterName = "@kodd";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = textBox1.Text;
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@k_npu";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = textBox2.Text;
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@k_ter";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = textBox3.Text;
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@kstr";
    					param.SqlDbType = SqlDbType.Int;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[0].Value;
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr1";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row[0].Cells[1].Value;
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr2";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[2].Value;
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr3";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[3].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr4";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[4].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr5";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[5].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr6";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[6].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr7";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[7].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr8";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[8].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr9";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[9].Value;
    
    					command.Parameters.Add(param);
    					param = new SqlParameter();
    					param.ParameterName = "@gr10";
    					param.SqlDbType = SqlDbType.Char;
    					param.Direction = ParameterDirection.Input;
    					param.Value = row.Cells[10].Value;
    
    					command.Parameters.Add(param);
    
    					command.ExecuteNonQuery();
    				}
    			
    				
    				
    				conn.Close();
    			}
    		}
    Тут циклом проходится по всем строкам и выполняется сохраненная процедура для данных из текущей строки

    27 августа 2012 г. 5:21
  • выдает след. ошибку   "   'object' does not contain a definition for 'Cells' and no extension method 'Cells' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)  ". В References нужно добавить какой то компонент? 
    27 августа 2012 г. 6:57
  • Поменяйте var в цикле на

    DataGridViewRow

    у вас почему то система не смогла определить тип

    • Помечено в качестве ответа Saamai Saparbekova 27 августа 2012 г. 7:32
    27 августа 2012 г. 7:07
  • ОГРОМНОЕ СПАСИБО!!! ЗАРАБОТАЛА.
    • Помечено в качестве ответа Saamai Saparbekova 27 августа 2012 г. 7:31
    27 августа 2012 г. 7:31
  • ОГРОМНОЕ СПАСИБО!!! ЗАРАБОТАЛО.
    27 августа 2012 г. 7:32