2

インターネットにリストされている多くのソリューションを試した後、私は今非常に混乱しています. ユーザーが値を選択できるように、単に ExecuteReader コマンドをドロップダウンリストにバインドしようとしている C#/SQL Web アプリケーションがあります。これは、XP OS 上の VS2008 プロジェクトです。

どのように機能するかは、ユーザーがテーブルを選択した後です。この選択を、Datamatch.aspx.cs ファイルのメソッドへの入力パラメーターとして使用します。次に、この Datamatch.aspx.cs ファイルは、ADONET.cs クラス ファイルからメソッドを呼び出します。最後に、このメソッドは SQL プロシージャを実行して、そのテーブルから列のリストを返します。(これらはすべて Adventureworks DB のテーブルです)。このSPをSSMSで実行すると、このメソッドが列のリストを正常に返すことがわかっています。ただし、VSで機能するかどうかはわかりません。

これは単純なはずです。これどうやってするの?これが私のコードの一部です。T-sql ストアド プロシージャ:

CREATE PROCEDURE [dbo].[getColumnNames]
@TableName VarChar(50) AS
BEGIN
SET NOCOUNT ON;
SELECT col.name 'COLUMN_NAME' FROM sysobjects obj
INNER JOIN syscolumns col ON obj.id = col.id
WHERE obj.name = @TableName
END

SSMS から以下を実行すると、必要な出力が得られます。exec getColumnNames 'AddressType'

現在、Datamatch.aspx.cs ファイルのコードは次のとおりです。

private void CreateDropDownLists() { SqlDataReader dr2 = ADONET_methods.DisplayTableColumns(targettable);

int NumControls = targettable.Length;
DropDownList ddl = new DropDownList();
DataTable dt = new DataTable();

dt.Load(dr2);

ddl.DataValueField = "id";
ddl.DataTextField = "text";
ddl.DataSource = dt;
ddl.DataBind();

for (int counter = 0; counter < NumberOfControls; counter++)
{
    ddl.ID = "DropDownListID " + (counter + 1).ToString();
    btnSubmit.Style.Add("top", "auto");
    btnSubmit.Style.Add("left", "auto");
    btnSubmit.Style.Add("position", "absolute");

    if (counter < 7)
    {
        ddl.Style["top"] = 100 * counter + 80 + "px";
        ddl.Style["left"] = 250 + "px";
        int bSubmitPosition = NumberOfControls * 100 + 80;
        btnSubmit.Style.Add("top", System.Convert.ToString(bSubmitPosition) + "px");
    }
    else if (counter >= 7)
    {
        ddl.Style["top"] = 100 * counter - 620 + "px";
        ddl.Style["left"] = 550 + "px";
        int bSubmitPosition = NumberOfControls * 100 - 620;
        btnSubmit.Style.Add("top", System.Convert.ToString(bSubmitPosition) + "px");
    }
    ddl.SelectedIndexChanged += new EventHandler(SelectedIndexChanged);
    ddl_ht.Add(counter, ddl.SelectedValue);

    pnlDisplayData.Controls.Add(ddl);
    pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
    pnlDisplayData.Visible = true;
    pnlDisplayData.FindControl(ddl.ID);
    //  dr.Close();
}

}

private void CreateLabels() { for (int counter = 0; counter < NumberOfControls; counter++) { Label lbl = new Label(); lbl.ID = "ラベル" + counter.ToString(); lbl.Text = headers[カウンター]; lbl.Style["位置"] = "絶対"; if (counter < 7) { lbl.Style["top"] = 100 * カウンター + 50 + "px"; lbl.Style["左"] = 250 + "px"; } else if (counter >= 7) { lbl.Style["top"] = (100 * counter) - 650 + "px"; lbl.Style["左"] = 550 + "px"; }

    pnlDisplayData.Controls.Add(lbl);
    pnlDisplayData.Controls.Add(new LiteralControl("<br><br><br>"));
}

}

ADONET_methods.DisplayTableColumns(targettable) の場所:

public static SqlDataReader DisplayTableColumns(string tt)
    {
        SqlDataReader dr = null;
        string TableName = tt;
        string connString = "Server=(local);Database=AdventureWorks;Integrated Security = SSPI";
        string errorMsg;
        SqlConnection conn2 = new SqlConnection(connString);
        SqlCommand cmd = new SqlCommand("getColumnNames");  //conn2.CreateCommand();

        try
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn2;
            SqlParameter parm = new SqlParameter("@TableName", SqlDbType.VarChar);
            parm.Value = "Person." + TableName.Trim();
            parm.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(parm);
            conn2.Open();
            dr = cmd.ExecuteReader();

        }
        catch (Exception ex)
        {
            errorMsg = ex.Message;
        }
        return dr;
    }

上記の CreateLabels メソッドは、ラベルを正しく表示します。しかし、CreateDropDownLists メソッドは、何も入っていない 1 つのドロップダウン リストを表示するだけです。つまり、選択不可です。では、データリーダーが 4 つの列すべてを返していることを確認し、それらの値を調べるにはどうすればよいでしょうか? データリーダー「COLUMN_NAME」から見つけることができましたが、列名を確認するために検索するプロパティがわかりません。

4

2 に答える 2

2

ADONET_methods.DisplayTableColumns(targettable) メソッドで、dr を返す前に、ブレークポイントを使用して dr.GetValue() の値を取得するかどうかを確認します。

string temp;
while(dr.Read())
{
    temp = dr.GetValue();  //use a breakpoint here
}

また、dataReader を使用して dataTable にロードする代わりに、dataAdapter を使用して dataTable を直接埋めることができます。

public static DataTable DisplayTableColumns(string tt) 
{ 
    Datatable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter();

    try 
    { 
        da.Fill(dt); 
    } 
    catch (Exception ex) 
    { 
        errorMsg = ex.Message; 
    } 

    string temp;
    foreach(DataRow row in dt.Rows)
    {
        foreach(DataColumn column in dt.Columns)
        {
            temp = (row[column]);  // use your breakpoint here
        }
    }

    return dt; 
} 
于 2010-04-09T07:06:51.577 に答える
2

このコードのどこかに実際にドロップダウンをバインドしているようには見えません。次のようなことをする必要があります:

ddl.DataTextField = "COLUMN_NAME";
ddl.DataValueField = "COLUMN_NAME";
ddl.DataSource = dr.ExecuteReader();
ddl.DataBind();

または、SqlDataSource コントロールを使用して、ページ マークアップでこれをすべて行うことができます。

  <asp:SqlDataSource
      id="SqlDataSource1"
      runat="server"
      DataSourceMode="DataSet"
      ConnectionString="myConnString"
      SelectCommand="myStoredProcedure"
      >
  </asp:SqlDataSource>

  <asp:MyDropDownList id="ddl" runat="server" DataSource="SqlDataSource1"
       DataTextField="COLUMN_NAME" DataValueField="COLUMN_NAME" />
于 2010-04-08T23:45:34.963 に答える