2

このメソッドを文字列パラメーターのみでテストしたところ、完全に機能しました。したがって、後で追加したDateTime(datapubl)タイプのパラメーターの設定に誤りがあると確信しています。前もって感謝します!

ちなみに、CatalogCreateFilmsTest sprocが実行され、正常に動作しています。

アンナ

public static bool CreateFilmTest(string nume, string datapubl)
        {
            DbCommand com = GenericDataAccess.CreateCommand();
            com.CommandText = "CatalogCreateFilmTest";

            DbParameter param = com.CreateParameter();
            param.ParameterName = "@nume";
            param.Value = nume;
            param.DbType = DbType.String;
            param.Size = 200;
            com.Parameters.Add(param);

            param = com.CreateParameter();
            param.ParameterName = "@datapubl";
            param.Value = datapubl;
            param.DbType = DbType.DateTime;
            com.Parameters.Add(param);


            int result = -1;

            try
            {
                result = GenericDataAccess.ExecuteNonQuery(com);

            }
            catch
            {
                // 
            }

            return (result >= 1);

        }

編集:問題は、ストアドプロシージャが実行されないことです(テーブルに行を挿入する必要がありますが、実行されません)。エラーはありませんが、正しい結果でもありません。

編集:クリス、ここに完全な例があります:

CREATE PROCEDURE CatalogCreateFilmTest(
@nume nvarchar(1500),
@datapubl datetime
)
AS
INSERT INTO Filme
(nume, datapubl) 
VALUES
(@nume, @datapubl)
;
GO

のために働く:

EXEC CatalogCreateFilmTest 'achu', '';

次に、次のようにCreateFilmTestを呼び出します。

bool success = FilmsAccess.CreateFilmTest(newNume.Text, null);

また:

bool success = FilmsAccess.CreateFilmTest(newNume.Text, DateTime.Now.ToString());

どちらの場合も、ExecuteNonQueryは実行されません。

4

3 に答える 3

4

コレクション内の参照のため、同じ変数を再利用できるとは思いません...

        DbParameter param1 = com.CreateParameter(); 
        param1.ParameterName = "@nume"; 
        param1.Value = nume; 
        param1.DbType = DbType.String; 
        param1.Size = 200; 
        com.Parameters.Add(param1); 


        DbParameter param2 = com.CreateParameter(); 
        param2.ParameterName = "@datapubl"; 
        param2.Value = datapubl; 
        param2.DbType = DbType.DateTime; 
        com.Parameters.Add(param2); 

また、.net 4(およびおそらく3.5)でもそのような構文を使用できることに注意してください。

com.Parameters.Add(
  com.CreateParameter()
  { 
    ParameterName = "@datapubl", 
    Value = datapubl, 
    DbType = DbType.DateTime
  }
);

また、catchブロックに入力することで、例外が何であるかを知るのに役立つ場合があります。

catch(Exception ex)
{ 
  System.Diagnostics.Debug.WriteLine(ex.Message); 
} 

編集:

私は今問題を見ていると信じています...(そして以前にそれを見るべきでした)。

メソッドシグネチャを次のように変更します。

public static bool CreateFilmTest(string nume, DateTime datapubl) 

そして、以下を実行してみてください。

bool success = FilmsAccess.CreateFilmTest(newNume.Text, DateTime.Now); 

nullを渡すにConvert.DbNullは、列でnullが許可されている場合に渡す必要があります。

文字列をDateTime値として渡すには、特定の方法、つまりYYYYMMDDで文字列をフォーマットする必要がありますが、基になるDbCommandオブジェクトにそれを処理させることをお勧めします。

于 2012-06-12T12:26:09.730 に答える
2

あなたは本当にこの行を追加する必要があります:

    com.CommandType = CommandType.StoredProcedure;

あなたがそれを渡すときにあなたのDateTimeが空である可能性はありますか?

そうでない場合は、そうでないことを確認するためにテストする必要があります。そうである場合は、次のように合格します。

    com.Parameters.AddWithValue("@datapubl, emptyDate == null ? DBNull.Value : (object)emptyDate);

これが問題だと確信しています。

これがお役に立てば幸いです。

編集 :

このブロック全体を置き換えます:

        param = com.CreateParameter();
        param.ParameterName = "@datapubl";
        param.Value = datapubl;
        param.DbType = DbType.DateTime;
        com.Parameters.Add(param);

このようなものによって:

       if(Date is null)
       {
         com.Parameters.AddWithValue("@datapubl", emptyDate == null ? DBNull.Value (object)emptyDate);
       }
       else
       {
         com.Parameters.AddWithValue("@datapubl", [Your Date Variable Here]);
       }
于 2012-06-12T14:10:32.643 に答える
0

これを試して、それがどのように機能するかを教えてください:

    param = new DBParameter("@datapubl", System.Data.DbType.DateTime);
    param.Value = datapubl;
    com.Parameters.Add(param)

それが役に立てば幸い

于 2012-06-12T12:27:34.223 に答える