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