0

ストアド プロシージャを実行して null データセットを取得しようとすると、このエラーが発生します。

private SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["learnaspConnectionString"].ConnectionString);

protected void btnregister_Click(object sender, EventArgs e)
{
        try
        {
            con.Open();
            SqlCommand cmd = new SqlCommand("dbo.RegisterInsert", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@fname", txtfname.Text);
            SqlParameter p2 = new SqlParameter("@lname", txtlname.Text);
            SqlParameter p3 = new SqlParameter("@company", txtcompany.Text);
            SqlParameter p4 = new SqlParameter("@phone", txtphone.Text);
            SqlParameter p5 = new SqlParameter("@address", txtaddress.Text);
            SqlParameter p6 = new SqlParameter("@email", txtemail.Text);
            cmd.Parameters.Add(p1);
            cmd.Parameters.Add(p2);
            cmd.Parameters.Add(p3);
            cmd.Parameters.Add(p4);
            cmd.Parameters.Add(p5);
            cmd.Parameters.Add(p6);
            cmd.ExecuteNonQuery();

            con.Close();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            da.Fill(ds);
            DataTable dt = ds.Tables[0];
            ListViewDetails.DataSource = ds;
            ListViewDetails.DataBind();
            lblmessage.Visible = true;
            lblmessage.Text = "Registration Completed Successfully!";
        }
        catch (SqlException ex)
        {
        }
}

私のストアドプロシージャは次のとおりです。

   CREATE PROCEDURE [dbo].[RegisterInsert] 
    -- Add the parameters for the stored procedure here
    @fname nvarchar(50),
    @lname nvarchar(50),
    @company nvarchar(50),
    @phone nvarchar(50),
    @address nvarchar(250),
    @email  nvarchar(250)   
       SET NOCOUNT ON;
        insert into [dbo].[register]
    ([fname],
     [lname],
     [company],
     [phone],
     [address],
     [email])
     values
     (@fname,
      @lname,
      @company,
      @phone,
      @address,
      @email)    
END

コードを実行すると、リストビュー コントロールで表示データを取得できません。ボタン クリック イベントがデータベースに値を 2 回格納し、「テーブル 0 が見つかりません」というエラーが発生します。

コードのどこが間違っているか教えてください。

前もって感謝します。

4

6 に答える 6

3

問題は、データセットにテーブル オブジェクトが含まれていないことです。したがって、DS.Table[0] は存在せず、エラーがスローされます。続行する前に、データセットにテーブルがあることを確認するチェックを追加します。

    // check if ds has a table
    if(DS.TABLES.COUNT>0)
    {
       //check if ds.table[0] has any rows  
       if(DS.TABLES[0].ROWS.COUNT>0){
       //do something
    }
 }
于 2015-07-10T19:44:40.370 に答える
0
             con.Open();
        SqlCommand cmd = new SqlCommand("dbo.RegisterInsert", con);
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter p1 = new SqlParameter("@fname", txtfname.Text);
        SqlParameter p2 = new SqlParameter("@lname", txtlname.Text);
        SqlParameter p3 = new SqlParameter("@company", txtcompany.Text);
        SqlParameter p4 = new SqlParameter("@phone", txtphone.Text);
        SqlParameter p5 = new SqlParameter("@address", txtaddress.Text);
        SqlParameter p6 = new SqlParameter("@email", txtemail.Text);
        cmd.Parameters.Add(p1);
        cmd.Parameters.Add(p2);
        cmd.Parameters.Add(p3);
        cmd.Parameters.Add(p4);
        cmd.Parameters.Add(p5);
        cmd.Parameters.Add(p6);
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);
        DataTable dt = new DataTable();
        dt = ds.Tables[0];

        ListViewDetails.DataSource = dt;
        ListViewDetails.DataBind();
        con.close();
        lblmessage.Visible = true;
        lblmessage.Text = "Registration Completed Successfully!";

データテーブルが正しく定義されていません。

DataTable dt = new DataTable();

この方法でデータソースをバインドします

 ListViewDetails.DataSource = dt;

データをバインドしたら、接続を閉じます。

con.close(); 

このコードは機能します。

于 2015-04-23T07:47:53.403 に答える
0

これを試して

    private SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["learnaspConnectionString"].ConnectionString);

    protected void btnregister_Click(object sender, EventArgs e)
    {
        try
        {
            con.Open();
            SqlCommand cmd = new SqlCommand("dbo.RegisterInsert", con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlParameter p1 = new SqlParameter("@fname", txtfname.Text);
            SqlParameter p2 = new SqlParameter("@lname", txtlname.Text);
            SqlParameter p3 = new SqlParameter("@company", txtcompany.Text);
            SqlParameter p4 = new SqlParameter("@phone", txtphone.Text);
            SqlParameter p5 = new SqlParameter("@address", txtaddress.Text);
            SqlParameter p6 = new SqlParameter("@email", txtemail.Text);
            cmd.Parameters.Add(p1);
            cmd.Parameters.Add(p2);
            cmd.Parameters.Add(p3);
            cmd.Parameters.Add(p4);
            cmd.Parameters.Add(p5);
            cmd.Parameters.Add(p6);
            cmd.ExecuteNonQuery();

            SqlDataAdapter da = new SqlDataAdapter("Select * from register",con);//Here  you are using same cmd that is for insert so you call insert procedure twice and that's why insert data twice 
            DataSet ds = new DataSet();
            da.Fill(ds);
            DataTable dt = ds.Tables[0];
            ListViewDetails.DataSource = ds;
            ListViewDetails.DataBind();
            lblmessage.Visible = true;
            lblmessage.Text = "Registration Completed Successfully!";


            con.Close();

        }
        catch (SqlException ex)
        {
        }
    }
于 2013-08-16T11:47:02.900 に答える
0

問題は次の行にあります。SqlDataAdapter da = new SqlDataAdapter(cmd);

アダプターを作成してよかったです。しかし、上記の行には 2 つの問題があります。

1.) 上記のメソッドは、実際にはSelectCommandofを指定するために使用されますSqlDataAdapterここでMSDNを確認してください。

2.) SqlConnectionこのアダプターに何を使用するかを指定していません。したがって、次のようにします。

SqlDataAdapter da = new SqlDataAdapter(cmd, conn);

connあなたのSqlConnectionオブジェクトはどこですか。

コードの最後の 8 行を見ると、基本的にデータを表示したいようです。

したがって、クエリを実行したら Line :cmd.ExecuteNonQuery();変更 し、クエリを実行cmd するストアド プロシージャのいずれかを割り当てます。 Select

また

Select query in cmdas :Select * from registerを指定できますが、コマンド タイプも次のように変更する必要があります。cmd.CommandType=CommandType.Text;

于 2013-08-16T12:13:05.483 に答える
0

完全に間違っています。

データベースから値を保存したいので、クエリを挿入する必要があります

データベースから値を読み取りたい場合は、クエリを選択する必要があります

しかし、 select query に insert query を使用しました。そして、クエリを2回(dataadapterとexecutenonquery)呼び出す必要があるため、データが2回挿入されました。

最初にこの記事を読む

于 2013-08-16T11:47:24.820 に答える
0

挿入クエリを使用しているため、null DataTable を取得しています。
insert ステートメントの後に別の select ステートメントを記述します。

    CREATE PROCEDURE [dbo].[RegisterInsert] 
-- Add the parameters for the stored procedure here
@fname nvarchar(50),
@lname nvarchar(50),
@company nvarchar(50),
@phone nvarchar(50),
@address nvarchar(250),
@email  nvarchar(250)   
   SET NOCOUNT ON;
    insert into [dbo].[register]
([fname],
 [lname],
 [company],
 [phone],
 [address],
 [email])
 values
 (@fname,
  @lname,
  @company,
  @phone,
  @address,
  @email)

select * from [dbo].[register]
于 2013-08-16T11:50:39.443 に答える