2009-06-25 7 views
1

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

2

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.

+0

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é. –

2

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 
0

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()) 
Questions connexes