2

「インデックスが配列の範囲外でした」というメッセージが表示されます。dr1 [1] .ToString()で。

type_id(int)、name(varchar(20)、amount(float)の3つの列を持つテーブルcontribution_masterがあります。すべてのamount行を抽出したいと思います。

SqlConnection SQLCon1 = new SqlConnection(ConfigurationManager.ConnectionStrings["PayrollConnStr"].ConnectionString.ToString());

    SqlCommand SQLCmd1 = new SqlCommand("SELECT amount FROM contribution_master", SQLCon1);

    try
    {
        SQLCon1.Open();
        SqlDataReader dr1 = SQLCmd1.ExecuteReader();
        while (dr1.Read())
        {
            employer_epf = Convert.ToDouble(dr1[0].ToString());
            employer_admin = Convert.ToDouble(dr1[1].ToString());
            employer_edli = Convert.ToDouble(dr1[2].ToString());
            employer_admin_edli = Convert.ToDouble(dr1[3].ToString());
            employer_esi = Convert.ToDouble(dr1[4].ToString());
        }
    }
    catch (SqlException ex)
    {
        string errorMessage = "Error ";
        errorMessage += ex.Message;
        lblWarn.Text = errorMessage;
        lblWarn.Visible = true;
    }
    finally
    {
        SQLCon1.Close();
    }
4

3 に答える 3

3

値はdr1[x]、データベースから読み取った列の位置に関連しています。

指定した SQLSELECT amount FROM contribution_masterは列を返しますが、この中のデータにはまたはamountを使用してのみアクセスできます。dr1[0]dr1["amount"]

while (dr1.Read())ループ内のデータの各行がなくなるまで反復します。ただし、各行に具体的にアクセスする必要がある場合は、データをデータテーブルに入力し、そこから値を割り当てる方がよい場合があります。

例えば:

SqlDataAdapter da = new SqlDataAdapter(SQLCmd1);
DataTable dt = new DataTable();
da.Fill(dt);

employer_epf = Convert.ToDouble(dt.Rows[0][0].ToString());
employer_admin = Convert.ToDouble(dt.Rows[1][0].ToString());
employer_edli = Convert.ToDouble(dt.Rows[2][0].ToString());
employer_admin_edli = Convert.ToDouble(dt.Rows[3][0].ToString());
employer_esi = Convert.ToDouble(dt.Rows[4][0].ToString());

これが役に立てば幸いですが、テーブルの軸を逆にした方が簡単ではないでしょうか?

于 2012-08-01T08:35:36.203 に答える
1

クエリから 1 つのフィールド (金額) のみを返すため、datareader には 1 つのフィールド (フィールド 0) しかありません。

を呼び出すたびdatareader.Read()に、単一の行が返されます。後続の行が必要な場合は、Read()再度呼び出します。

だから、あなたのコードで...

if (dr1.Read())
{
    employer_epf = Convert.ToDouble(dr1[0].ToString()); 
    if (dr1.Read())
    {
        employer_admin = Convert.ToDouble(dr1[0].ToString()); 
        // etc...
    }
}

またはDataTable、一度にすべての行を返す を設定することもできます。

于 2012-08-01T07:59:53.037 に答える
0

SELECT ステートメントを変更します。amount(テーブルから列を選択しました)

SELECT * FROM contribution_master
于 2012-08-01T08:00:00.917 に答える