以下代码给出了一个错误 - "没有从DBnull到int的隐式转换".
SqlParameter[] parameters = new SqlParameter[1];
SqlParameter planIndexParameter = new SqlParameter("@AgeIndex", SqlDbType.Int);
planIndexParameter.Value = (AgeItem.AgeIndex== null) ? DBNull.Value : AgeItem.AgeIndex;
parameters[0] = planIndexParameter;
Run Code Online (Sandbox Code Playgroud) 我正在社交网络上工作,我的一个程序返回一个VARCHAR输出.所以这就是我写的:
SqlParameter job1 = cmd2.Parameters.Add("@job", SqlDbType.VarChar);
job1.Direction = ParameterDirection.Output;
Run Code Online (Sandbox Code Playgroud)
但是出现此错误:
String [1]:Size属性的大小无效.
我有以下代码使用存储过程拉回DataTable并输入字符串参数@JobNumbers,这是动态创建的作业编号字符串(因此长度未知):
using (SqlConnection connection = new SqlConnection(con))
{
SqlCommand cmd = new SqlCommand("dbo.Mystoredprocedure", connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@JobNumbers", SqlDbType.VarChar, 4000);
cmd.Parameters["@JobNumbers"].Value = JobNumber;
SqlDataAdapter da = new SqlDataAdapter(cmd);
connection.Open();
da.Fill(JobDetails);
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我当前将JobNumber参数设置为4000的长度,这应该足以承担大约500个作业号并且应该足够了.但是,有可能在奇怪的场合需要更多.所以,我想知道,有没有办法将参数设置为nvarchar(max)的等效sql参数类型?
我已经看过各种类似的问题(将参数传递给SQLCommand的最佳方法是什么?)但没有具体说明你是否可以(或不能)这样做.其次,如果我将存储过程中的@JobNumber参数设置为nvarchar(max),甚至需要这样做,因此我可能根本不需要在C#中设置长度?如果我这样做,这将有潜在的性能问题,如此问题中所建议的在添加SqlCommand参数时何时应该使用"SqlDbType"和"size"??
我有webservice,它传递了一组int.我想按如下方式执行select语句,但不断出错.我需要将数组更改为字符串吗?
[WebMethod]
public MiniEvent[] getAdminEvents(int buildingID, DateTime startDate)
{
command.CommandText = @"SELECT id,
startDateTime, endDateTime From
tb_bookings WHERE buildingID IN
(@buildingIDs) AND startDateTime <=
@fromDate";
SqlParameter buildID = new SqlParameter("@buildingIDs", buildingIDs);
}
Run Code Online (Sandbox Code Playgroud) 我做的是这样的:
SqlParameter param = new SqlParameter("@Param", 0) { SqlDbType = SqlDbType.Int };
private void TestParam(SqlParameter param) {
string test = param.Value.ToString(); // Getting NullReferenceException here
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样说时,我停止获取异常:
SqlParameter param = new SqlParameter("@Param", SqlDbType.Int) { Value = 0 };
private void TestParam(SqlParameter param) {
string test = param.Value.ToString(); // Everything OK
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么SqlParameter假设0与null相同?
编辑: MSDN在此解释:SqlParameter构造函数
我想将xml文件传递给sql server存储过程,如下所示:
CREATE PROCEDURE BookDetails_Insert (@xml xml)
Run Code Online (Sandbox Code Playgroud)
我想比较一些字段数据与其他表数据,如果匹配,则必须将记录插入到表中.
要求:
如何将XML传递给存储过程?我试过这个,但它不起作用:[工作]
command.Parameters.Add(
new SqlParameter("@xml", SqlDbType.Xml)
{
Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml,
XmlNodeType.Document, null))
});
Run Code Online (Sandbox Code Playgroud)如何访问存储过程中的XML数据?
编辑:[工作]
String sql = "BookDetails_Insert";
XmlDocument xmlToSave = new XmlDocument();
xmlToSave.Load("C:\\Documents and Settings\\Desktop\\XML_Report\\Books_1.xml");
SqlConnection sqlCon = new SqlConnection("...");
using (DbCommand command = sqlCon.CreateCommand())
{
**command.CommandType = CommandType.StoredProcedure;**
command.CommandText = sql;
command.Parameters.Add(
new SqlParameter("@xml", SqlDbType.Xml)
{
Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
, XmlNodeType.Document, null))
});
sqlCon.Open();
DbTransaction trans = sqlCon.BeginTransaction();
command.Transaction = trans;
try
{ …Run Code Online (Sandbox Code Playgroud) 我在一段代码中发现了一个奇怪的问题,即即使其参数与数据源中的记录匹配,adhoc SQL查询也没有产生预期的输出.我决定将以下测试表达式输入到即时窗口中:
new SqlParameter("Test", 0).Value
Run Code Online (Sandbox Code Playgroud)
这给了null我一个让我挠头的结果.似乎SqlParameter构造函数将零视为空值.以下代码生成正确的结果:
SqlParameter testParam = new SqlParameter();
testParam.ParameterName = "Test";
testParam.Value = 0;
// subsequent inspection shows that the Value property is still 0
Run Code Online (Sandbox Code Playgroud)
谁能解释这种行为?这是故意的吗?如果是这样,它可能相当危险......
我目前正在尝试为数据库中的所有存储过程编写一个简单的C#包装类.
在C#中构建一些参数时,我注意到属性SqlParameter.IsNullable,并想知道这是什么.据我所知,不可能将存储过程参数声明为NOT NULL,因此始终允许将NULL传递给任何参数.
通过测试,似乎将IsNullable属性设置为false无效,仍然允许将SqlParameter.Value属性设置为null.
任何人都可以解释这个属性的目的吗?
谢谢你的期待.
寻求赏金的答案者应该查看这些链接:
我假设SqlParameter.IsNullable仅在......时才有意义?
http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/b7a08616-58d1-4cdc-a3e9-9353e292667b
我有以下代码行:
sqlcommand.Parameters.Add("@LinkID", SqlDbType.Int, 4).Value = linkID;
Run Code Online (Sandbox Code Playgroud)
但是,我对使用它有点困惑size.这是说它的4个字节大小?或者4的长度1234是可以接受但是12345太大了?
你会如何指定:
Decimal(18,2)
Run Code Online (Sandbox Code Playgroud)
在这:
SqlComm.Parameters.Add("@myValue", SqlDbType.Decimal, 0, "myValue");
Run Code Online (Sandbox Code Playgroud)
目前我已经precision = 2从设计方面定义了属性.我只是好奇如何从代码中完成这个.谢谢