Как создать параметр odbcparamet для xl-типа данных сервера sql для объекта odbccommand? - PullRequest
1 голос
/ 26 июня 2009

Итак, у меня есть ситуация, когда мне нужно передать кучу данных на сервер, чтобы создать кучу записей. Поэтому я прочитал эту статью и выбрал метод XML. Итак, у меня есть хранимая процедура, созданная в SQL Server 2005. Но теперь мне нужно вызвать ее из кода asp.net Только все, что у меня есть для подключения к базе данных, это odbcconnection. Я вижу, что sqlclient, похоже, имеет собственный sqldbtype.xml. Что мне делать, если я использую odbc? Я SOL?

Ответы [ 3 ]

2 голосов
/ 26 июня 2009

Оказывается, я могу использовать неявное преобразование varchar / ntext в XML. Я пробовал оба Varchar и NText - они оба работали. Преобразование другим способом не поддерживает неявное преобразование, вы должны выполнить явное преобразование согласно документам. В любом случае, вот пример функции и хранимой процедуры, которую она вызывает.

Код 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

Хранимая процедура

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
2 голосов
/ 26 июня 2009

Я думаю, вы должны использовать SQLConnection и связанные с ним классы.

Сказав это, вы можете использовать VS.net Server Explorer, установить соединение с SQL Server с помощью ODBC, развернуть дерево с помощью хранимых процедур и просмотреть свою хранимую процедуру с параметром XML.

Должен отображаться тип данных ODBC для него при щелчке правой кнопкой мыши по свойствам параметра XML.

Это чисто основано на моей памяти. Я думаю, это должно работать.

РЕДАКТИРОВАТЬ: посмотрите, поможет ли эта ссылка . См. Слово DataTypeCompatibility по этой ссылке.

0 голосов
/ 08 июля 2009

Для тех, кто использует XMLTextWriter для создания XML, необходимо использовать кодировку UTF-16 (Unicode в .net) Итак, вот код для создания 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())

А вот код для вызова хранимой процедуры

  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())
...