Donc, j'ai une situation où j'ai besoin de transmettre un tas de données au serveur pour créer un tas d'enregistrements. J'ai donc lu this article et choisi la méthode XML. J'ai donc la procédure stockée tout créé dans SQL Server 2005. Mais maintenant je dois l'appeler à partir du code asp.net. Seulement tout ce que j'ai pour une connexion à une base de données est un odbcconnection. Je vois le sqlclient semble avoir un natif sqldbtype.xml. Que dois-je faire si j'utilise odbc? Suis-je SOL?Comment créer un odbcparameter pour un type de données xml server sql pour un objet odbccommand?
Répondre
Je pense que vous devriez utiliser SQLConnection & classes liées. Cela dit, vous pouvez utiliser VS.net Server Explorer, établir une connexion à SQL Server en utilisant ODBC, développer l'arborescence avec les procédures stockées et voir votre procédure stockée avec le paramètre XML.
Il doit afficher le type de données ODBC lorsque vous cliquez avec le bouton droit de la souris sur les propriétés du paramètre XML.
Ceci est purement basé sur ma mémoire. Je pense que cela devrait fonctionner.
EDIT: Voir si ce link aide. Voir pour le mot DataTypeCompatibility sur ce lien.
Il s'avère que je peux utiliser la conversion implicite de varchar/ntext en XML. J'ai essayé à la fois Varchar et NText - ils ont tous deux travaillé. La conversion dans l'autre sens ne supporte pas la conversion implicite, vous devez faire une conversion explicite selon les docs. Quoi qu'il en soit, voici un exemple de fonction et la procédure stockée qu'elle appelle.
Code ADO.Net
Private Sub cmdXMLTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdXMLTest.Click
Dim objConnection As System.Data.Odbc.OdbcConnection
Dim cmdTest As System.Data.Odbc.OdbcCommand
Dim drTest As System.Data.Odbc.OdbcDataReader
Dim intCount As System.Int32
Dim strMatter As System.String = ""
Dim strXML As System.String = "<Root><Matter mmatter=""11415.09951"" /><Matter mmatter=""06625.06771"" /><Matter mmatter=""00931.09846"" /></Root>"
' build odbc command for getting parties
cmdTest = New System.Data.Odbc.OdbcCommand
cmdTest.CommandType = CommandType.StoredProcedure
cmdTest.CommandTimeout = 60
cmdTest.CommandText = "{CALL uspXMLTest (?)}"
cmdTest.Parameters.Add("@list", System.Data.Odbc.OdbcType.NText).Value = strXML
objConnection = New System.Data.Odbc.OdbcConnection("Driver={SQL Server};Server=mysqlserver;Database=son_db;Uid=sa;Pwd=mypassword;")
objConnection.Open()
cmdTest.Connection = objConnection
drTest = cmdTest.ExecuteReader(CommandBehavior.CloseConnection)
Do While drTest.Read()
strMatter = drTest.GetString(0)
intCount = intCount + 1
Loop
MsgBox("Found " & intCount.ToString() & " Matters - Last One = " & strMatter)
End Sub
procédure stockée
CREATE PROCEDURE uspXMLTest
@list xml
AS
SET NOCOUNT ON
SELECT matter.mmatter, matter.mdesc1
FROM matter
INNER JOIN @list.nodes('/Root/Matter') AS ml(mmatter) ON (matter.mmatter = ml.mmatter.value('@mmatter', 'varchar(15)'))
GO
Pour ceux qui utilisent XmlTextWriter pour créer le fichier XML que vous devez utiliser le codage UTF-16 (Unicode dans .net). Alors voici le code pour créer le XML.
' create xml file for folders
strmFolderList = New System.IO.MemoryStream()
wrtFolderList = New System.Xml.XmlTextWriter(strmFolderList, System.Text.Encoding.Unicode)
' start document and add root element
wrtFolderList.WriteStartDocument()
wrtFolderList.WriteStartElement("Root")
' cycle through folders
For intIndex = 0 To m_intAdditionalFolderQuantity - 1
' figure out folder description
strFolderDesc = m_arrFolderDesc(intIndex)
' add element to xml
wrtFolderList.WriteStartElement("Folder")
wrtFolderList.WriteAttributeString("folderdesc", strFolderDesc)
wrtFolderList.WriteAttributeString("insertfolder", ((intIndex + 1) * -1).ToString())
wrtFolderList.WriteEndElement()
Next
' close root element and document
wrtFolderList.WriteEndElement()
wrtFolderList.WriteEndDocument()
wrtFolderList.Close()
'System.Text.Encoding.Unicode.GetString(strmFolderList.ToArray())
Et voici le code pour appeler la procédure stockée
cmdAddRequest = New System.Data.Odbc.OdbcCommand
cmdAddRequest.CommandType = CommandType.StoredProcedure
cmdAddRequest.CommandTimeout = 60
cmdAddRequest.CommandText = "{CALL uspAddRequest (?, ?, ?, ?, ?, ?, ?, ?, ?)}"
' add parameters to odbc command
cmdAddRequest.Parameters.Add("@ruserid", OdbcType.VarChar, 8).Value = SafeODBCParamString(m_strUID)
cmdAddRequest.Parameters.Add("@rmatter", OdbcType.VarChar, 15).Value = SafeODBCParamString(m_strMatterNumber)
cmdAddRequest.Parameters.Add("@req_tkinit", OdbcType.VarChar, 8).Value = SafeODBCParamString(m_strRequesting)
cmdAddRequest.Parameters.Add("@ret_tkinit", OdbcType.VarChar, 8).Value = SafeODBCParamString(m_strReturnNumber)
cmdAddRequest.Parameters.Add("@requestor", OdbcType.VarChar, 20).Value = SafeODBCParamString(m_strRequestor)
cmdAddRequest.Parameters.Add("@labels_only", OdbcType.Bit).Value = m_blnLabelsOnly
cmdAddRequest.Parameters.Add("@folder_quantity", OdbcType.SmallInt).Value = m_intAdditionalFolderQuantity
cmdAddRequest.Parameters.Add("@folder_list", OdbcType.NText).Value = System.Text.Encoding.Unicode.GetString(strmFolderList.ToArray())
cmdAddRequest.Parameters.Add("@insert_list", OdbcType.NText).Value = System.Text.Encoding.Unicode.GetString(strmInsertList.ToArray())
- 1. Comment créer un déclencheur DDL pour toutes les bases de données dans l'instance SQL Server 2005
- 2. Comment XML sérialiser un 'Type'
- 3. Comment créer un membre const pour un type immuable?
- 4. Rechercher un objet dans SQL Server (base de données croisée)
- 5. Comment créer un script pour sauvegarder toutes les bases de données dans SQL Server?
- 6. Existe-t-il un langage XML pour définir/créer des schémas de base de données SQL?
- 7. Sql Type de données pour la clé primaire - SQL Server?
- 8. Comment jeter dynamiquement un objet de type chaîne à un objet de type T
- 9. Y at-il une fonction pour vérifier si un objet est un type de données intégré?
- 10. Utilisation du type de données XML SQL Server
- 11. Créer dynamiquement un objet de <Type>
- 12. Comment créer un algorithme pour le centroïde d'un objet System.Windows.Media.Geometry?
- 13. Quel type de données SQL Server dois-je utiliser pour stocker un octet []
- 14. Comment créer un sol pour un jeu?
- 15. Utilisation correcte du type de données XML dans SQL Server?
- 16. Type de données XML SQL Server requête numéro
- 17. Convertir un type de données XML dans SQL 2005 en un jeu de résultats relationnel
- 18. Comment créer une méthode pour un objet personnalisé en JavaScript?
- 19. Mappage NHibernate pour SQL Server 2008 Hiérarchie Type de données
- 20. Comment créer LINQ Arbre d'expression pour sélectionner un type anonyme
- 21. Qu'est-ce qui provoquerait un service WCF pour renvoyer un objet de type "objet"
- 22. Comment utiliser JSON pour créer un objet qui hérite du type d'objet?
- 23. Java: suffisamment de tas libre pour créer un objet?
- 24. Comment créer un agent SQL Server sans utiliser d'interface graphique?
- 25. Utilisation des ensembles de données XML pour un rapport Crystal
- 26. Test d'un objet pour ne pas être un type
- 27. Requête SQL pour un schéma de base de données
- 28. Ajouter des données dans un type de données binaire SQL Server
- 29. Comment créer un bookmarklet pour créer un grattage d'écran?
- 30. Comment "cloner" un objet dans un objet de sous-classe?
Visual Studio voit comme OdbcType.NText. Ça a marché. J'ai même vérifié une chaîne de plus de 8000 caractères et cela a bien fonctionné. –