2

これが私のコードです

      // SqlCommand query = new SqlCommand("INSERT INTO devis (idProposition, identreprise, tauxHoraire, fraisGenerauxMO, fraisGenerauxPiece, beneficeEtAleas, idStatut, prixUnitaireVenteMO ) VALUES(@idproposition,  @identreprise, @tauxHoraire, @fraisGenerauxMO, @fraisGenerauxPiece, @beneficeEtAleas, 1, @prixUnitaireVenteMO) ", Tools.GetConnection());
     SqlCommand query = new SqlCommand("INSERT INTO devis (idProposition, identreprise, tauxHoraire, fraisGenerauxMO, fraisGenerauxPiece, beneficeEtAleas, idStatut, prixUnitaireVenteMO, alerteEntrepriseEnvoyee,fraisDeplacement ) VALUES(1051,  85, 20, 2, 2, 2.2, 1, 88,0,-1) ", Tools.GetConnection());

    //query.Parameters.AddWithValue("idproposition", this.ID);
    //query.Parameters.AddWithValue("identreprise", competitor.ID);
    //query.Parameters.AddWithValue("tauxHoraire", competitor.CoefTauxHoraire);
    //query.Parameters.AddWithValue("fraisGenerauxMO", competitor.CoefFraisGenerauxMO);
    //query.Parameters.AddWithValue("fraisGenerauxPiece", competitor.CoefFraisGenerauxPiece);
    //query.Parameters.AddWithValue("beneficeEtAleas", competitor.CoefBeneficeEtAleas);
    //query.Parameters.AddWithValue("prixUnitaireVenteMO", Math.Round(competitor.CoefTauxHoraire * competitor.CoefFraisGenerauxMO * competitor.CoefBeneficeEtAleas, 2));
 bool insertOK = (query.ExecuteNonQuery() == 1);
 if (insertOK)
 {
    // DO SOMETHING
 }

insertOkはfalseですが、データベースでは、指定したすべての情報を含む行が挿入されます

問題がクエリに起因するかどうかを確認するためにクエリを手動で再構築しました。パラメーター、エラーなしでデータベースに再度挿入されますが、insertOk はまだ false です! nullではないはずの他の2つのフィールドを追加しましたが、どちらの場合もアクティビティは同じです

何か案は?

4

4 に答える 4

8

ExecuteNonQueryそれは返すと主張しThe number of rows affected.ます。クライアントが影響を受ける行数を知る方法がないため、これは正しくありません。ドキュメントでは、エンジンが影響を受ける行数を報告すると誤って想定していますが、それはセッションSET NOCOUNT状態の影響を受けます。NOCOUNT が常にオンであると想定するコードを記述しないでください。影響を受ける行数を知る必要がある場合は、OUTPUTを使用します。@@ROWCOUNTまたは の状態に依存することは、SET NOCOUNTさまざまな観点から値が正しくない多くの多くのまれなケースの影響を受けます。

于 2013-03-29T11:18:59.403 に答える
3

UPDATE、INSERT、および DELETE ステートメントの場合、戻り値はコマンドによって影響を受けた行の数です。

挿入または更新されるテーブルにトリガーが存在する場合、戻り値には、挿入操作または更新操作の両方によって影響を受ける行の数と、トリガーまたはトリガーによって影響を受ける行の数が含まれます。他のすべてのタイプのステートメントの場合、戻り値は -1 です。ロールバックが発生した場合、戻り値も -1 です。

于 2013-03-29T11:16:56.003 に答える
1

ExecuteNonQueryメソッドが返すSystem.Int32

接続に対して Transact-SQL ステートメントを実行し、影響を受けた行の数を返します。

Return Value
Type: System.Int32
The number of rows affected.

あなたのquery.ExecuteNonQuery()返品なので、2あまりにも明白な2 == 1返品falseです。

クエリは次のようになります。

bool insertOK = (2 == 1);

DEMO.

于 2013-03-29T11:20:51.270 に答える
0

そのようなものを使ってみてくださいSqlDataAdapter :

SqlDataAdapter Adabter = new SqlDataAdapter();
 Adabter.InsertCommand = new SqlCommand("INSERT INTO devis values(@idProposition, @identreprise), Tools.GetConnection());

 Adabter.InsertCommand.Parameters.Add("@idproposition",SqlDbType.Int).Value = yorID;
 Adabter.InsertCommand.Parameters.Add("@identreprise", SqlDbType.Int).Value = yorID;

 Tools.OpenConnection();
 int result = Adabter.InsertCommand.ExecuteNonQuery();
 Tools.CloseConnection();

if( result  > 0 )
{
                MessageBox.Show("Information Added");
}else
{
                  MessageBox.Show("Error");
}
于 2013-03-29T11:33:45.347 に答える