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

时间:2009-03-21 20:10:59

标签: 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.Parameters["@City"].Value = "100";}

我得到的例外:

“将nvarchar值'Seattle'转换为。时转换失败 数据类型int。“

A)上述异常表明运行时确实设法转换了 将String类型的值转换为Int32类型的值,从而得到 SqlServer上发生异常?!

B)由于String和Int32是不兼容的类型,为什么运行时 首先执行从String到Int32的转换?

不是我们处理不兼容类型的事实 运行时“意识到”应用程序很可能有一个错误,类似于方式 编译器“意识到”它正在处理(在下面的代码中)有两个 不兼容的类型:

String s = ”something”;
int i = (int)s; //error



Q2:

A) public void GetEmployee(int EmployeeID);

<asp:ObjectDataSource  SelectMethod=”GetEmployee” …>
  <SelectParameters>
    <asp:ControlParameter Name = ”EmployeeID” ...>
  </SelectParameters>


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

为什么运行时会进行这样的转换?不会抛出一个 异常更有意义吗?

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

Q3:

<asp:SqlDataSource ID="sourceEmployees" runat="server"
     ProviderName="System.Data.SqlClient"
     ConnectionString="<%$ ConnectionStrings:Northwind %>"
     SelectCommand="SELECT EmployeeID, FirstName,LastName,
     Title, City FROM Employees WHERE City=@City">
         <SelectParameters>
             <asp:Parameter Name="City"/>
         </SelectParameters>
</asp:SqlDataSource> 

A)我假设你没有指定参数的类型 实例“City”是,它自动是Object类型,意思是它 以后可以分配任何类型的值。因此,如果“城市”更晚(比方说) 在SqlDataSource2_Selecting()事件处理程序内部分配了一个值 错误的类型,只会在Sql上检测到这个错误的赋值 服务器,而不是之前(当然Sql server将报告该错误 回到web服务器)?

B)如果我们创建一个类型为NVarChar(20)的SqlParameter实例并且想要 要将此参数传递给存储过程,将Ado.net传递给 存储过程只是这个参数的值,或者它也是 以某种方式通知程序该参数的确切类型(哪个 是NVarChar(20))?

thanx

3 个答案:

答案 0 :(得分:2)

这是SQL Server错误。您遇到了datatype precedence问题。

线索在这里:

SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE
City=@City --here exactly

City列是nvarchar 参数显式设置为int

将它们全部加在一起,你得到:

SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE
City=100

根据数据类型先前规则,数据库引擎会尝试将City的所有值更改为“int”。当然,它失败了。

对于你的观点:

  • Q1:同样的问题。没有人告诉SQL Server“100”应该是字符串
  • Q2:SQL中的空字符串强制转换为零。如果您想要SQL null
  • ,请发送dbnull.value
  • Q3A。 SQL没有对象数据类型。它看起来是100并决定“int”
  • Q3B。是的,使用存储过程并正确定义。

总体而言,SQL Server的行为与广告完全一致。在这种情况下,您根本没有提供足够的信息。

编辑:存储过程使用

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

答案 1 :(得分:1)

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

由于我没有在任何地方看到“西雅图”,我猜这个错误实际上来自你正在调用的存储过程 - 即。无论你在proc中使用@City是什么问题。这听起来好像不是做“CityID = @ City”之类的东西,而是在做“CityName = @ City”,而且它抱怨它无法将CityName(“Seattle”)的一个值转换为一个整数,用于与@City进行比较。

答案 2 :(得分:0)

  

我猜这个错误实际上来自你正在调用的存储过程 - 即。无论你在proc中使用@City是什么问题。这听起来好像不是做“CityID = @ City”之类的东西,而是在做“CityName = @ City”,而且它抱怨它无法将CityName(“Seattle”)的一个值转换为一个整数,用于与@City进行比较。

我故意使用不兼容的类型只是为了得到我的观点 - &gt;这是'为什么运行时甚至懒得尝试将值从一个不兼容的类型转换为另一个,因为用户将字符串分配给整数类型的变量这一事实表明它很可能是一个错误而不是用户明知故犯的事情?