Contrôles de source de données et conversion de type de paramètre

Q1 – Dans l'exemple de code ci-dessous, runtime convertit une valeur entre deux types incompatibles:

<SelectParameters> <asp:Parameter Name="City" Type="Int32" /> </SelectParameters> protected void SqlDataSource2_Selecting(object sender, SqlDataSourceSelectingEventArgs e) {e.Command.Parameters["@City"].Value = "100";} 

Exception que j'ai eu:

"La conversion a échoué lors de la conversion de la valeur nvarchar 'Seattle' en type de données int."

A) L'exception ci-dessus suggère que runtime a réussi à convertir une valeur de type Ssortingng en une valeur de type Int32, et donc l'exception s'est produite sur SqlServer ?!

B) Puisque Ssortingng et Int32 sont des types incompatibles, pourquoi l'exécution a-t-elle effectué la conversion de Ssortingng en Int32 en premier lieu?

Le fait que nous ayons affaire à un type incompatible fait que runtime "réalise" que l'application a probablement un bug, similaire à la façon dont le compilateur "réalise" qu'il traite (dans le code ci-dessous) avec deux types incompatibles:

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

Q2:

A) public void GetEmployee (int EmployeeID);

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

Si, pour une raison quelconque, le paramètre EmployeeID est NULL, ObjectDataSource convertira Null à zéro et le transmettra comme argument à la méthode GetEmployee ().

Pourquoi l'exécution fait-elle une telle conversion? Est-ce que lancer une exception n'aurait pas plus de sens?

B) "Utilisez la propriété ConvertEmptySsortingngToNull pour spécifier si une valeur de string vide est automatiquement convertie en valeur nulle lorsque le champ de données est mis à jour dans la source de données."
Je ne comprends pas très bien l'utilité de cette propriété. Pourquoi une string vide indique-t-elle que nous voulons que null soit inséré dans le champ de données de la source? Je suppose que ce champ de données est de type Ssortingng? Alors pourquoi ne pas avoir aussi ConvertZeroInt32ToNull etc?

Q3:

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

A) Je suppose que lorsque vous ne spécifiez pas de quel type l'instance de paramètre "City" est, il est automatiquement de type Object, ce qui signifie qu'il peut ensuite être assigné une valeur de n'importe quel type. Ainsi, si "Ville" est postérieure (par exemple dans le gestionnaire d'events SqlDataSource2_Selecting ()), une assignation erronée ne sera détectée que sur le server Sql, et pas avant (bien sûr, le server Sql signalera cette erreur au web server)?

B) Si nous créons une instance SqlParameter de type NVarChar (20) et que nous voulons passer ce paramètre à une procédure stockée, Ado.net transmettra-t-il à une procédure stockée la valeur de ce paramètre, ou informera-t-il en quelque sorte la procédure? type exact de ce paramètre (qui est NVarChar (20))?

merci

Ceci est une erreur SQL Server. Vous avez rencontré un problème de priorité de type de données .

L'indice est ici:

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

La colonne City est nvarchar Le paramètre est explicitement défini sur int

En ajoutant tout cela, vous obtenez:

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

Par les règles du type de données precedemce, le moteur de database essaye de changer toutes les valeurs de City en "int". Et échoue, bien sûr.

Pour vos points cependant:

  • Q1: Même problème. Nulle part avez-vous dit à SQL Server que le "100" devrait être une string
  • Q2: les strings vides sont mises à zéro dans SQL. Envoyer dbnull.value si vous voulez un SQL nul
  • Q3a. SQL n'a aucun type de données d'object. Il regarde 100 et décide "int"
  • Q3b. Oui, utilisez un proc stocké et définissez-le correctement.

Dans l'set, SQL Server se comporte exactement comme annoncé. Dans ce cas, vous ne donnez pas assez d'informations.

Modifier: utilisation de proc stockée

Vous indiquez à SQL le type de données lorsque vous ajoutez le paramètre à la collection de parameters. Vous définissez (et créez) le proc stocké pour avoir le paramètre nvarchar.

Je vais juste essayer de répondre à votre première question – "La conversion a échoué lors de la conversion de la valeur nvarchar 'Seattle' en type de données int."

Puisque je ne vois nulle part "Seattle", je suppose que cette erreur vient en fait de la procédure stockée que vous appelez – ie. tout ce que vous utilisez @City pour le proc est le problème. Cela ressemble plutôt à faire quelque chose comme "où CityID = @ City", vous faites un "where CityName = @ City", et il se plaint qu'il ne peut pas convertir l'une des valeurs de CityName ("Seattle") à un entier pour le comparer avec @City.

Je suppose que cette erreur vient en fait de la procédure stockée que vous appelez – ie. tout ce que vous utilisez @City pour le proc est le problème. Cela ressemble plutôt à faire quelque chose comme "où CityID = @ City", vous faites un "where CityName = @ City", et il se plaint qu'il ne peut pas convertir l'une des valeurs de CityName ("Seattle") à un entier pour le comparer avec @City.

J'ai utilisé des types incompatibles juste pour get mon sharepoint vue -> qui est pourquoi l'exécution même peine à essayer de convertir une valeur d'un type incompatible à un autre, puisque le fait que l'user a affecté une string à la variable de type entier, suggère que c'est probablement un bug et non quelque chose que l'user a fait sciemment?