-1

変数を宣言し、正しい値を返していますが、なぜこのエラーがまだ発生するのかわかりません。

  sqlString.Append( " SELECT  Medication.Description + ' - ' + Medication.Strength + ' - ' + Medication.MedicationCode as DrugName, Resident.Title + ' ' + Resident.firstName + ' ' + Resident.Surname AS Resident, MedicationDispenseTimeslot.MedicationDosageBarcode, 0 AS checkBox " );
             sqlString.Append( " FROM Medication INNER JOIN MedicationDispense ON Medication.MedicationID = MedicationDispense.MedicationID INNER JOIN Resident ON MedicationDispense.ResidentID = Resident.ResidentID INNER JOIN MedicationDispenseStatus ON MedicationDispense.MedicationDispenseStatusID = MedicationDispenseStatus.MedicationDispenseStatusID INNER JOIN MedicationDispenseTimeslot ON MedicationDispense.MedicationDispenseID = MedicationDispenseTimeslot.MedicationDispenseID WHERE     (MedicationDispenseStatus.MedicationDispenseStatusID = 2) and  MedicationDispense.MedicationDispenseID in (select MedicationDispenseID from dbo.MedicationDispenseHistory where DATEDIFF(d, 0, DateTimeStamp) =DATEDIFF(d, 0, GETDATE()) and MedicationDispenseStatusID=2) AND MedicationDispense.ResidentID = @residentID " );
             sqlString.Append( " AND   (MedicationDispense.MedicationDispenseStatusID > 1) AND ");
             sqlString.Append( "    1 = (CASE WHEN MedicationDispense.StopDate IS NULL " );
             sqlString.Append( "                 THEN (CASE WHEN MedicationDispense.StartDate <= @periodEndDate THEN 1 ELSE 0 END) " );
             sqlString.Append( "            ELSE " );
             sqlString.Append( "                CASE WHEN (MedicationDispense.StartDate between @periodStartDate and @periodEndDate) " );
             sqlString.Append( "                                OR " );
             sqlString.Append( "                          (MedicationDispense.StopDate between @periodStartDate and @periodEndDate) " );
             sqlString.Append( "                                OR " );
             sqlString.Append( "                          (MedicationDispense.StartDate < @periodStartDate and MedicationDispense.StopDate > @periodEndDate) " );
             sqlString.Append( "    GROUP BY Medication.Description + ' - ' + Medication.Strength + ' - ' + Medication.MedicationCode, Resident.Title + ' ' + Resident.firstName + ' ' + Resident.Surname , MedicationDispenseTimeslot.MedicationDosageBarcode " );

             command = new SqlCommand(sqlString.ToString(), connection);
             command.Parameters.Add( "@residentID", SqlDbType.Int ).Value = residentID.ToString();
             command.Parameters.Add("@periodStartDate", SqlDbType.DateTime).Value = Helper.GetValue(periodStartDate);
             command.Parameters.Add("@periodEndDate", SqlDbType.DateTime).Value = Helper.GetValue(periodEndDate);

編集

  command = new SqlCommand( sqlString.ToString(), connection );

     SqlDataAdapter dataAdapter = new SqlDataAdapter( command );
     dataAdapter.Fill( ds, "dataTable" );

     return ds;
4

2 に答える 2

1

これは、木に対して木を見ない例です。

SqlCommand コマンドを問題なく作成していますが、使用していません。代わりに、使用している新しい SqlCommand コマンドを作成します。パラメータは、この SqlCommand オブジェクトに追加されません。

于 2013-08-14T12:07:01.537 に答える
1

連結された文字列でSQLを書くと、この問題が発生します.SQLに移動して直接実行されるため、連結された文字列として静的クエリを書くことができますが、ここで私が理解できることは、sqlString.ToString()の出力が表示される場合、いくつか含まれています@residentID 、 @periodEndDate などの変数は、実行時に contextvand で使用できず、パラメーターとしても定義されていないため、エラーが発生する理由です。パラメーターとして渡している場合でも、スカラー変数 @resident を宣言する必要がありますが、パラメータを渡すことができない連結文字列。

そのため、ストアド プロシージャを使用することをお勧めします。これは、動的クエリと複数のクエリを一度に実行するために作成されています。保存されたパラメーターでは、パラメーターを定義して値を渡すことができます。

c# を使用してストアド プロシージャがどのように機能するかを確認する

C# を使用してストアド プロシージャを実行する方法

于 2013-08-14T11:21:12.543 に答える