2010-09-10 5 views
2

J'essaie d'écrire du code C# simple qui va sélectionner certaines données d'une instance SQL Server, modifier les données et mettre à jour les modifications dans la base de données. Mais j'ai du mal à comprendre exactement comment faire. Voici une version simplifiée de mon code:Est-il possible d'utiliser SqlTypes avec un SqlDataAdapter?

using (SqlConnection conn = new SqlConnection("Server=(local);Integrated Security=true;Database=master")) 
{ 
    SqlDataAdapter da = new SqlDataAdapter("SELECT ID, Field FROM test", conn); 
    SqlCommandBuilder cb = new SqlCommandBuilder(da); 
    DataSet ds = new DataSet(); 
    da.Fill(ds, "test"); 

    foreach (DataRow dr in ds.Tables["test"].Rows) 
    { 
     dr["Field"] = someFunction((SqlString)dr["Field"]); 
    } 

    da.Update(ds, "test"); 
} 

Mais ce code me donne l'erreur suivante:

System.InvalidCastException: specified cast is not valid.

Je changer le code à utiliser string plutôt que SqlString:

dr["Field"] = someFunction((string)dr["Field"]); 

Mais alors j'obtiens cette erreur s'il y a des nulls dans mes données:

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.

Je pensais que le qui Le point de l'espace de noms SqlTypes consistait à fournir des types capables de gérer les valeurs nulles de la base de données. Si tel est le cas, pourquoi ne puis-je pas les utiliser avec un SqlDataAdapter? J'espère qu'il me manque quelque chose d'évident.

+0

Qu'advient-il si vous faites 'dr.GetSqlString (indexOfFieldColumn)'? – womp

+0

Whups ... peu importe, j'ai mal interprété votre "dr" comme datareader, pas datarow. Cela ne marchera pas. – womp

+0

@womp: Erreur 'System.Data.DataRow' ne contient pas de définition pour 'GetSqlString' – Bounderby

Répondre

0

Du commentaire de womp:

Si datatable avait la colonne Champ tapé à SqlString, ne serait pas le casting (SqlString) dr [ "Champ"] réussir ce point? - womp 10 septembre à 17:11

C'était la bonne réponse.

1

Je pourrais avoir tort ici (juste un avertissement), mais je pense que vous devez faire un nouveau SqlString de votre valeur de DB, comme ceci: Je pense que cela fonctionnera pour votre cas nul, je n'ai pas testé quand même.

SqlString str = (dr["Field"] == null) ? SqlString.Null : new SqlString((string)dr["Field"]); 
someFunction(str); 
+0

+1 - cela fonctionnera. La plus grande question est pourquoi ne pouvez-vous pas obtenir la fonction 'DataAdapter.Fill()' pour créer une base de données qui utilise SqlTypes? Il ne semble pas y avoir d'options pour le faire. – womp

+0

Cela ne fonctionnait pas: Argument '1': impossible de convertir 'objet' en 'chaîne' – Bounderby

+0

'someFunction (new SqlString ((chaîne) dr [" Field "]))' – womp

0

Essayez

dr["Field"] = someFunction(dr["Field"] is DbNull ? null : (string)dr["Field"]); 
1

Vous recherchez la propriété ReturnProviderSpecificTypes:

dataAdapter.ReturnProviderSpecificTypes = true;