Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据源控件和参数类型转换_C#_Asp.net_Sql_Sql Server_Ado.net - Fatal编程技术网

C# 数据源控件和参数类型转换

C# 数据源控件和参数类型转换,c#,asp.net,sql,sql-server,ado.net,C#,Asp.net,Sql,Sql Server,Ado.net,Q1-在下面的代码示例中,运行时在两个值之间转换一个值 不兼容类型: <SelectParameters> <asp:Parameter Name="City" Type="Int32" /> </SelectParameters> protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e) {e.Command.



Q1-在下面的代码示例中,运行时在两个值之间转换一个值 不兼容类型:

  <SelectParameters>
 <asp:Parameter Name="City" Type="Int32" />
 </SelectParameters>



protected void SqlDataSource2_Selecting(object sender,
       SqlDataSourceSelectingEventArgs e)
{e.Command.Parameters["@City"].Value = "100";}
String s = ”something”;
int i = (int)s; //error


问题2:

(A) public void GetEmployee(intemployeeid)



如果出于任何原因EmployeeID参数为NULL,则ObjectDataSource 将Null转换为零,并将其作为参数传递给GetEmployee() 方法

为什么运行时要进行这样的转换?我不会扔一个 例外更有意义吗?

B) “使用ConvertEmptyStringToFull属性指定 当数据丢失时,空字符串值将自动转换为null 字段已在数据源中更新。“
我不太明白这财产的用处。为什么会 空字符串表示我们希望将null插入源的 数据字段?我假设这个数据字段的类型是String?然后 为什么不也有ConvertZeroInt32ToNull等?

问题3:


A) 我假设当您不指定哪种类型的参数 实例“City”是,它自动为Object类型,这意味着 以后可以指定任何类型的值。因此,如果“城市”更晚(比如 在SqlDataSource2(选择()事件处理程序)中,为 如果类型错误,则只能在Sql上检测到此错误分配 服务器,而不是之前(当然SQLServer将报告该错误) 返回到web服务器)?

B) 如果我们创建一个NVarChar(20)类型的SqlParameter实例,并希望 要将此参数传递给存储过程,Ado.net是否会传递给 存储过程只是此参数的值,还是将其也 以某种方式告知程序此参数的确切类型 是NVarChar(20))?


thanx

我试着回答你的第一个问题-- “将nvarchar值'Seattle'转换为数据类型int时,转换失败。”

由于我在任何地方都没有看到提到“西雅图”,我猜这个错误实际上来自于您正在调用的存储过程——也就是说,无论您在proc中使用@City做什么,都是问题所在。这听起来好像不是在做“where CityID=@City”之类的事情,而是在做一个“where CityName=@City”,它在抱怨它不能将CityName(“西雅图”)的一个值转换成整数来与@City进行比较

我猜这个错误实际上来自于您正在调用的存储过程——也就是说,无论您在proc中使用@City做什么,都是问题所在。这听起来好像不是在做“where CityID=@City”之类的事情,而是在做一个“where CityName=@City”,它在抱怨它不能将CityName(“西雅图”)的一个值转换成整数来与@City进行比较


我故意使用了不兼容类型,只是为了让大家了解-->这是“为什么运行时还要费心尝试将值从一种不兼容类型转换为另一种不兼容类型,因为用户将字符串分配给integer类型的变量这一事实表明,这很可能是一个bug,而不是用户故意做的事情”

这是一个SQL Server错误。你碰到了一个问题

线索如下:

SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE
City=@City --here exactly
城市纵队是nvarchar 该参数显式地设置为int

将其全部相加,您将得到:

SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE
City=100
根据数据类型PRECENDMCE的规则,数据库引擎尝试将城市的所有值更改为“int”。当然,失败了

不过,对于您的观点:

  • 问题1:同样的问题。您没有告诉SQLServer“100”应该是字符串
  • 问题2:在SQL中,空字符串强制转换为零。如果需要SQL null,请发送dbnull.value
  • Q3a。SQL没有对象数据类型。它看100,决定“int”
  • Q3b。是的,使用存储过程并正确定义它
总的来说,SQL Server的行为与广告中的完全一样。在这种情况下,您只是没有提供足够的信息

编辑:存储过程使用


将参数添加到parameters集合时,可以告诉SQL数据类型是什么。您定义(并创建)存储的进程以具有nvarchar参数。

看在上帝的份上,请将这些问题分开!我认为在一个帖子里有几个问题比在多个帖子里发垃圾邮件更可取?但如果这能让我得到更多的回复>Q3b,我会将它们分开。是的,使用存储过程并正确定义它。是的,因为在Ado.net中,它只会将参数的值传递给sql server,还是还会将此参数的确切类型通知sql server?>Q3b。是的,使用存储过程并正确定义它。是的,因为在Ado.net中,它只会将参数的值传递给sql server,或者还会将此参数的确切类型通知sql server?您可以编辑您的帖子和/或对Jonathan Rupp的帖子发表评论。
SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE
City=@City --here exactly
SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE
City=100