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 回答