2009-03-21 2 views
1



데이터 소스 제어 및 매개 변수 형식 변환

Q1 - 런타임 아래의 코드는, 두 호환 형식 사이의 값으로 변환에서 : I있어

<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로 변환 할 때 오류가 발생했습니다. "

) 위의 예외는 런타임에서 String 유형의 값을 Int32 유형의 값으로 변환 할 수 있으므로예외가 SqlServer에서 발생했음을 나타냅니다. 문자열 및 INT32가 호환되지 않는 유형이기 때문에

B), 왜 런타임 첫 번째 장소에서 INT32에 문자열에서 변환을 수행 했습니까?

우리가 호환되지 않는 유형 다루고있는 것은 그 응용 가능성이 가장 높은 방법 컴파일러 similary 버그를 가지고있다 "실현" 런타임을한다는 사실은 함께 (아래 코드)를 다루는 사용자들은 "실현"하지 않습니다 이 개 호환되지 않는 유형 :

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



Q2 :

A) 공공 무효의 GetEmployee (int EmployeeID);


<asp:ObjectDataSource SelectMethod=”GetEmployee” …> 
    <SelectParameters> 
    <asp:ControlParameter Name = ”EmployeeID” ...> 
    </SelectParameters> 
의 경우 직원 ID 매개 변수가 NULL 어떤 이유로, ObjectDataSource를 제로로 널 변환 GetEmployee라는() 방법에 인수로 전달됩니다합니다.

런타임이 이러한 변환을 수행하는 이유는 무엇입니까? 예외를 던지는 것이 더 의미가 없습니까?

B)는 "데이터 필드가 데이터 소스에 업데이트 될 때 빈 문자열 값이 자동으로 null로 변환할지 여부를 지정 ConvertEmptyStringToNull 속성을 사용합니다."
을 내가 꽤 이해가 안 돼요 이 속성의 유용성. 빈 문자열은 소스의 데이터 필드에 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 [email protected]"> 
     <SelectParameters> 
      <asp:Parameter Name="City"/> 
     </SelectParameters> 
</asp:SqlDataSource> 

A) 나는 당신이 형식 매개 변수 예 "시"는 수를 의미 유형 객체의 자동입니다있는 지정하지 않는 경우 가정 나중에 모든 유형의 값이 지정됩니다. 따라서 "City"가 나중에 (예 :, SqlDataSource2_Selecting() 이벤트 처리기 내에서) 값이 잘못 지정된 경우이 잘못된 할당은 SQL 서버에서만 감지되며 Sql 서버는 오류를보고합니다 웹 서버로 돌아 가기)?

B) 우리 형 NVARCHAR의 SqlParameter에 인스턴스 (20)를 생성하고 저장 과정이 매개 변수를 통과 원하는 경우 프로 시저이 파라미터 단지 값을 전달 ADO.NET 것 또는 어떻게 든이 매개 변수의 정확한 유형을 프로 시저에 알립니다 ( 은 NVarChar (20) 임).

고맙습니다

+0

신의 사랑을 위해 다음 질문을 분리하십시오! –

+0

여러 스레드가있는 포럼을 스팸하는 것보다 한 스레드에서 여러 질문을하는 것이 더 바람직하다고 생각했습니다. 하지만 그게 나에게 더 많은 답변을 얻을 수 있다면 그들을 분리합니다 – SourceC

+0

정말 같은 질문 – gbn

답변

1
난 그냥 당신의 첫 번째 질문에 대답하려고합니다

- ". int 데이터 형식으로 NVARCHAR 값 '시애틀'을 변환 할 때 변환 실패" 을

내가 돈 때문에 ' t "시애틀"어디서나 언급 된 참조하십시오, 나는이 오류가 실제로 당신이 호출하는 저장 프로 시저에서 온 것 같아요 - 즉. proc에서 @City를 사용하는 것이 무엇이든간에 문제입니다. 그것은 "CityID = @ City"와 같은 것을하는 대신 "CityName = @ City"를 사용하고 CityName ("Seattle")의 값 중 하나를 다음으로 변환 할 수 없다고 불평합니다. 그것을 @City와 비교하기위한 정수.

0

나는이 오류가 실제로 당신이 호출하는 저장 프로 시저에서 온다고 생각합니다. proc에서 @City를 사용하는 것이 무엇이든간에 문제입니다. 그것은 "CityID = @ City"와 같은 것을하는 대신 "CityName = @ City"를 사용하고 CityName ("Seattle")의 값 중 하나를 다음으로 변환 할 수 없다고 불평합니다. 그것을 @City와 비교하기위한 정수.

실제로 호환되지 않는 유형을 사용하여 호환되지 않는 유형을 다른 호환 유형에서 다른 유형으로 변환하려고 시도하는 데 방해가되는 이유는 무엇입니까? 정수형의 변수는 버그 일 가능성이 높으며 사용자가 고의로하지 않은 것을 제안합니다.

+1

당신은 귀하의 게시물을 편집하고/또는 Jonathan Rupp의 게시물에 댓글을 달 수 있습니다. – chappjc

2

이것은 SQL Server 오류입니다. datatype precedence 문제를 쳤습니다.

는 단서가 여기에 있습니다 :

SELECT EmployeeID, FirstName,LastName, Title, City FROM Employees WHERE 
[email protected] --here exactly 

시 열 매개 변수가

이 모두 함께 추가 int로 명시 적으로 세트입니다 NVARCHAR , 당신이 얻을 :

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

datatype preemce 규칙에 따라 데이터베이스 엔진은 City의 모든 값을 "int"로 변경하려고 시도합니다. 물론 실패합니다. 하지만 당신의 포인트

:

  • Q1 : 같은 문제를 해결합니다. "100"은 문자열이어야합니다.
  • Q2 : 빈 문자열은 SQL에서 0으로 변환됩니다. SQL null을 원하면 dbnull.value를 보내십시오.
  • Q3a. SQL에는 오브젝트 데이터 유형이 없습니다. 100을보고 "int"를 결정합니다.
  • Q3b. 예, 저장된 proc를 사용하고 올바르게 정의하십시오.

전반적으로 SQL Server는 보급 된 것과 정확히 일치합니다. 이 경우 충분한 정보를 제공하지 못합니다. 편집

: 저장된 프로 시저 사용

당신은 당신이 매개 변수 컬렉션에 매개 변수를 추가 할 때 데이터 유형이 무엇인지 SQL을 말한다. 저장 프로 시저를 정의하고 생성하여 nvarchar 매개 변수를 갖습니다.

+0

> Q3b. 예, 저장된 proc를 사용하고 올바르게 정의하십시오. 예, Ado.net에서 매개 변수의 값만 SQL Server에 전달하거나 SQL Server에이 매개 변수의 정확한 유형을 알립니 까? – SourceC

+0

> Q3b. 예, 저장된 proc를 사용하고 올바르게 정의하십시오. 예, Ado.net에서와 같이 매개 변수의 값만 SQL Server에 전달하거나 SQL Server에이 매개 변수의 정확한 유형을 알립니 까? – SourceC

관련 문제