C# 通过创建datetime将null传递到sql server 2012 datetime时出现问题?变量到我的存储过程
这是我的业务对象层C# 通过创建datetime将null传递到sql server 2012 datetime时出现问题?变量到我的存储过程,c#,sql-server,datetime,C#,Sql Server,Datetime,这是我的业务对象层 public class Servicetransactionbol { public Servicetransactionbol() { st_id = default(int); st_startdate = default(DateTime); st_enddate = default(DateTime); } private int st_id; private DateTi
public class Servicetransactionbol
{
public Servicetransactionbol()
{
st_id = default(int);
st_startdate = default(DateTime);
st_enddate = default(DateTime);
}
private int st_id;
private DateTime st_startdate;
private DateTime st_enddate;
public int STid
{
get { return this.st_id; }
set { this.st_id = value; }
}
public DateTime STstartdate
{
get { return this.st_startdate; }
set { this.st_startdate = value; }
}
public DateTime STenddate
{
get { return this.st_enddate; }
set { this.st_enddate = value; }
}
}
这是我的业务访问层
public class servicetransactionbal
{
servicetransactiondal servicetransactionDAL = new servicetransactiondal();
public void insertTransaction(Servicetransactionbol servicetransactionBOL)
{
try
{
servicetransactionDAL.Inserttransaction(servicetransactionBOL);
}
catch(Exception ex)
{
throw ex;
}
finally
{
}
}
}
public class servicetransactiondal
{
public void Inserttransaction(Servicetransactionbol servicetransactionBOL)
{
try
{
Database db = DatabaseFactory.CreateDatabase("GeniusStockTraders");
DbCommand dbc = db.GetStoredProcCommand("Sproc_service_transaction");
db.AddOutParameter(dbc, "srvid", DbType.Int32, servicetransactionBOL.STid);
db.AddInParameter(dbc, "srv_startdate", DbType.DateTime, servicetransactionBOL.STstartdate);
db.AddInParameter(dbc, "srv_enddate", DbType.DateTime, servicetransactionBOL.STenddate);
db.AddInParameter(dbc, "ttype", DbType.String, "insert_transaction");
db.ExecuteNonQuery(dbc);
dbc.Dispose();
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
}
}
这是我的数据访问层
public class servicetransactionbal
{
servicetransactiondal servicetransactionDAL = new servicetransactiondal();
public void insertTransaction(Servicetransactionbol servicetransactionBOL)
{
try
{
servicetransactionDAL.Inserttransaction(servicetransactionBOL);
}
catch(Exception ex)
{
throw ex;
}
finally
{
}
}
}
public class servicetransactiondal
{
public void Inserttransaction(Servicetransactionbol servicetransactionBOL)
{
try
{
Database db = DatabaseFactory.CreateDatabase("GeniusStockTraders");
DbCommand dbc = db.GetStoredProcCommand("Sproc_service_transaction");
db.AddOutParameter(dbc, "srvid", DbType.Int32, servicetransactionBOL.STid);
db.AddInParameter(dbc, "srv_startdate", DbType.DateTime, servicetransactionBOL.STstartdate);
db.AddInParameter(dbc, "srv_enddate", DbType.DateTime, servicetransactionBOL.STenddate);
db.AddInParameter(dbc, "ttype", DbType.String, "insert_transaction");
db.ExecuteNonQuery(dbc);
dbc.Dispose();
}
catch (Exception ex)
{
throw ex;
}
finally
{
}
}
}
最后这是我的代码
SqlDateTime? enddate;
protected void btn_Save_Click(object sender, EventArgs e)
{
try
{
Database db = DatabaseFactory.CreateDatabase("GeniusStockTraders");
servicetransactionBOL.STid = default(int);
servicetransactionBOL.STscript = txt_script.Text;
servicetransactionBOL.STstartdate = Convert.ToDateTime(txt_startdate.Text);
if (string.IsNullOrEmpty(txt_enddate.Text))
{
enddate = SqlDateTime.Null;
servicetransactionBOL.STenddate = (DateTime)enddate;
}
else
{
servicetransactionBOL.STenddate = Convert.ToDateTime(txt_enddate.Text);
}
有了这段代码,当我的文本字段为空时,我可以插入datetime的最小值,但当我的文本字段为空时,我想插入NULL。我试着把datetime作为datetime?在我的业务对象层中,我可以在LOCALHOST中将NULL值插入到我的enddate中,但当我在线上传相同的文件时,会引发异常
找不到方法:“System.datetime GeniusTockTradersBol.ServeItemTransactionBol.get_STenddate()
请帮我解决这个问题
谢谢当日期=分钟('1/1/1900')时,在insert
中使用case语句,然后为空
,将'1/1/1900'
传递为“空”值
将此转化为OP所说的答案,解决了问题。不发送值为
null
:的参数。如果您遇到有关未定义的变量/参数的问题,则必须将null
替换为DBNull.Value
。是的,这很烦人。例如:
DateTime? someValue = ... // could be null
db.AddInParameter(dbc, "some_name", DbType.DateTime,
(object)someValue ?? DBNull.Value);
请注意,在您提供的示例中,两个日期时间都是DateTime
,而不是DateTime?
,但它适用于更一般的情况
至于:
找不到方法:“System.datetime GeniusTockTradersBol.ServeItemTransactionBol.get_STenddate()
这与null
值无关,只是表明您尚未完全构建/部署dll,即服务器有一个没有属性访问器的dll版本您的DateTime列是否在数据库表中标记为允许null?您的数据库服务器版本不同。。生产和开发服务器变量在插入中使用一个case语句,当Date=MIN('1/1/1900'),然后为NULL,将'1/1/1900'
传递为“空”value@GregC是的,我在我的模式中将我的datetime列标记为allow null。如果您得到“method not found”,则可能是部署问题。确保正在部署为此项目编译的所有程序集。另外,并不是说C#是一种区分大小写的语言,而且你在这里发布的内容的大小写不一致;如果您的意思是null:发送null。没有必要发明额外的哨兵值。