DateTime参数问题

时间:2012-06-12 12:21:31

标签: c# sql visual-studio-2008

我单独测试了这个方法的字符串参数,它完美地运行了。所以我确信在设置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都不会运行。

3 个答案:

答案 0 :(得分: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

为了将字符串作为DateTime值传递,您必须以特定方式格式化它们,即YYYYMMDD但是,我建议让底层DbCommand对象处理它。

答案 1 :(得分: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]);
       }

答案 2 :(得分:0)

试试这个并告诉我它是如何运作的:

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

希望有所帮助