-2

SQL Serverでクエリをテストしましたが、C#では機能しません。エラーメッセージは、クエリによって返される変数の格納メカニズムを示していますが、問題はおそらくクエリ自体であると考えています。

Delphiには、クエリステートメント(ステートメント)をデバッグする方法がありますshowMessage

例えば:-

DMS.ADOQuery1.SQL.Clear;
DMS.ADOQuery1.SQL.Add('select FIRSTNM, LASTNM, STREET, STREET2, CITY, STATE, ZIP, MEMBERKEY, MEMBID, BIRTH' +
        ' from MEMBER' +
        ' where MEMBID = ''' + Mem_ID + ''''
       );
showmessage(DMS.ADOQuery1.SQL[0]);

C#で同様のことを行う方法はありますか?誰かが見て、SQLクエリがASP.netでは機能しないがSQL Serverでは機能する理由を教えてもらえますか?

// initialize
string [] HPCODE = new string[20] ;
string [] OPFROMDT = new string [20] ;
string [] OPTHRUDT = new string [20] ;

// Second SQL Query to find out eligibility information about the requested Member. // 
SqlConnection Connection1 = new SqlConnection(DBConnect.SqlServerConnection);
String strSQL1 = "SELECT MEMBER, HPCODE, convert(varchar, OPFROMDT, 101) as OPFROMDT, convert(varchar, OPTHRUDT, 101) as OPTHRUDT FROM [main].[dbo].[MEMBER] INNER JOIN [main].[dbo].[MEMBHP] ON MEMBER.MEMBERKEY = MEMBHP.MEMBERKEY and opthrudt >= opfromdt INNER JOIN [main].[dbo].[HPCONTRACT] ON MEMBHP.HPCODEKEY = HPCONTRACT.HPCODEKEY INNER JOIN [main].[dbo].[LOB] ON HPCONTRACT.LOB_KEY = LOB.LOB_KEY where MembID = @memID";
SqlCommand command1 = new SqlCommand(strSQL1, Connection1);
//command1.Parameters.AddWithValue("@memID", memID);

// SQL reader variable is set.
SqlDataReader Dr1;
// Connection is explicitly opened.
Connection1.Open();
// Reader is executed.
Dr1 = command1.ExecuteReader();

int i = 0;

while (Dr1.Read())
{
//    if (memID == Dr["MEMBID"].ToString() )
//     {
// store subID in the Global variable called ID.

    HPCODE[i]   = (Dr1["HPCODE"].ToString()).TrimEnd();
    OPFROMDT[i] = (Dr1["OPFROMDT"].ToString()).TrimEnd();
    OPTHRUDT[i] = (Dr1["OPTHRUDT"].ToString()).TrimEnd();

    i = i + 1; 
//     }
}

// Reader variable must always be explicitly closed to prevent memory leaks.
Dr1.Close();

エラー:

範囲外のインデックスユーザーコードで処理されない例外:= HPCODe

注:-
Parameters.AddwithValueコードの前の部分で事前定義されているため、コメントはありません。解決策がそんなに簡単だったら、私はそれを自分で直したでしょう。*

4

1 に答える 1

5
// initialize
string [] HPCODE = new string[20] ;
string [] OPFROMDT = new string [20] ;
string [] OPTHRUDT = new string [20] ;

20を超える行が返されるため、ループの21番目の行を埋めようとするとエラーが発生します。これはSQLの問題ではありません。これはコーディングの問題です。

簡単な修正として、次のことができます。ただし、情報がすべて関連している場合は、情報を保持するクラスを作成し、そのクラスを作成することをお勧めしますList

// initialize
List<string> HPCODEs = new List<string>();
List<string> OPFROMDTs = new List<string>();
List<string> OPTHRUDTs = new List<string>();

ループでは、次のものが必要になります。

HPCODEs.Add((Dr1["HPCODE"].ToString()).TrimEnd());
OPFROMDTs.Add((Dr1["OPFROMDT"].ToString()).TrimEnd());
OPTHRUDTs.Add((Dr1["OPTHRUDT"].ToString()).TrimEnd());   
于 2013-02-07T21:49:12.453 に答える