0

データフォームをSQLに保存するプログラムを作成しようとしています。最初にフォームから挿入クエリを作成してこの部分を作成し、完全に機能しましたが、コードをより堅牢にし、SQL ストアド プロシージャを使用してプログラムを高速化したいと考えました。私のSQLからのプロシージャコードは次のとおりです(これは、プロシージャの変更オプションからのコードです):

USE [DBStudent]
GO


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[shto_student_proc] 

    @result int output,
    @emer_std [nvarchar](50),
    @atesi_std [nvarchar](50) ,
    @mbiemer_std [nvarchar](50) ,
    @datelindje_std [nvarchar](50) ,
    @dok_std [nvarchar](50) ,
    @nrdok_std [nvarchar](50),
    @adresa_std [nvarchar](50) ,
    @telefon_std [nvarchar](50),
    @kategori_std [nvarchar](50) ,
    @aktiv_std [nvarchar](2) ,
    @email_std [nvarchar](50) ,
    @menaxher_std nvarchar(2)

AS
BEGIN
    SET NOCOUNT ON;
SELECT @result=COUNT(*) from dbo.student
WHERE st_emer=@emer_std and st_mbiemer=@mbiemer_std and st_datelindje=@datelindje_std and st_dok=@dok_std
    -- check if record exists
    IF @result=0 
    BEGIN
    INSERT INTO student ([st_emer],[st_atesi],[st_mbiemer],[st_datelindje],[st_dok],[st_nrdok],[st_adresa],[st_telefon],[st_kategoria],st_aktiv,[st_email],st_menaxher) 
    VALUES (@emer_std,@atesi_std,@mbiemer_std ,@datelindje_std,@dok_std,@nrdok_std ,@adresa_std,@telefon_std,@kategori_std,@aktiv_std,@email_std,@menaxher_std )
    END
END

GO

ボタンの C# コードは次のとおりです。

private void save_btn_Click(object sender, EventArgs e)
        {
            string date=dtl_dtp.Value.ToString("yyyyMMdd");
            string komand_procedura = " EXECUTE dbo.shto_student_proc @emer_std,@atesi_std,@mbiemer_std ," +
                "@datelindje_std,@dok_std,@nrdok_std ,@adresa_std,@telefon_std,@kategori_std,@aktiv_std,@email_std,@menaxher_std ";
            SqlCommand cmd = new SqlCommand(komand_procedura,con1);
            cmd.Parameters.Add(new SqlParameter("@emer_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@emer_std"].Value = emer_tb.Text;
            cmd.Parameters.Add(new SqlParameter("@atesi_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@atesi_std"].Value = atesi_tb.Text;
            cmd.Parameters.Add(new SqlParameter("@mbiemer_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@mbiemer_std"].Value = mbiemer_tb.Text;
            cmd.Parameters.Add(new SqlParameter("@datelindje_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@datelindje_std"].Value = date;
            cmd.Parameters.Add(new SqlParameter("@dok_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@dok_std"].Value = dok_cmb.Text;
            cmd.Parameters.Add(new SqlParameter("@nrdok_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@nrdok_std"].Value = nrdok_tb.Text;
            cmd.Parameters.Add(new SqlParameter("@adresa_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@adresa_std"].Value = textBox5.Text;
            cmd.Parameters.Add(new SqlParameter("@telefon_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@telefon_std"].Value = textBox6.Text;
            cmd.Parameters.Add(new SqlParameter("@kategori_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@kategori_std"].Value = comboBox1.Text;
            cmd.Parameters.Add(new SqlParameter("@aktiv_std",SqlDbType.NVarChar,2));
            cmd.Parameters["@aktiv_std"].Value="PO";
            cmd.Parameters.Add(new SqlParameter("@email_std",SqlDbType.NVarChar,50));
            cmd.Parameters["@email_std"].Value = textBox7.Text;
            //MessageBox.Show(cmd.Parameters["@email_std"].Value.ToString());
            cmd.Parameters.Add("@menaxher_std", SqlDbType.NVarChar, 2);
            cmd.Parameters["@menaxher_std"].Value="JO";
            SqlParameter output = cmd.Parameters.Add("@result",SqlDbType.Int);
            output.Direction = ParameterDirection.ReturnValue;
            con1.Open();
            try
            {                
                cmd.ExecuteNonQuery();
                MessageBox.Show("Added "+output.ToString()+" rows");            
            }
            catch (SqlException ex)
            {
                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            con1.Close(); 
}

このエラーが発生しています:

プロシージャーまたは関数 'shto_student_proc' は、指定されていないパラメーター '@menaxher_std' を予期しています。

テキストボックスを使用して、値がパラメーターに追加されたかどうかを確認してみました。誰でも私を助けることができますか?

4

2 に答える 2

3

SQL Server のようにコマンド全体ではなく、CommandText をプロシージャ名として指定する必要があります。したがって、コマンド テキストは次のようになります。

SqlCommand cmd = new SqlCommand("dbo.shto_student_proc",con1);

CommandType をストアド プロシージャとして指定する必要があります。

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter を追加して値を指定する代わりに、短いバージョンのAddWithValueを次のように使用できます。

cmd.Parameters.AddWithValue("@menaxher_std", "JO");
于 2013-04-29T06:56:13.620 に答える
0

あなたのエラーはおそらくSQLのためです

    @menaxher_std nvarchar(2)

に変更する必要があります

    @menaxher_std [nvarchar](2)
于 2013-04-29T07:24:30.903 に答える