Sql 不在表中存储数据的存储过程
我的问题是,在执行存储过程时,XML数据没有保存在表中。我没有收到任何错误代码:(( 我的xml文件: 如果您在阅读下面的“我的xml文件”时遇到问题,请单击联机查看(更容易理解) 我的vb.net代码隐藏在asp.net中:Sql 不在表中存储数据的存储过程,sql,sql-server,xml,vb.net,stored-procedures,Sql,Sql Server,Xml,Vb.net,Stored Procedures,我的问题是,在执行存储过程时,XML数据没有保存在表中。我没有收到任何错误代码:(( 我的xml文件: 如果您在阅读下面的“我的xml文件”时遇到问题,请单击联机查看(更容易理解) 我的vb.net代码隐藏在asp.net中: Imports System.IO Imports System.Data Imports System.Configuration Imports System.Data.SqlClient Partial Class UploadXml Inherits
Imports System.IO
Imports System.Data
Imports System.Configuration
Imports System.Data.SqlClient
Partial Class UploadXml
Inherits System.Web.UI.Page
Protected Sub UploadXML(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_upload.Click
Dim fileName As String = Path.GetFileName(FileUpload1.PostedFile.FileName)
Dim filePath As String = Server.MapPath("~/Uploads/") & fileName
FileUpload1.SaveAs(filePath)
Dim xml As String = File.ReadAllText(filePath)
Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
Using con As New SqlConnection(constr)
Using cmd As New SqlCommand("InsertXML")
cmd.Connection = con
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@xml", xml)
con.Open()
cmd.CommandTimeout = 120
cmd.ExecuteNonQuery()
con.Close()
End Using
End Using
End Sub
End Class
我的html标记:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="UploadXml.aspx.vb" Inherits="UploadXml" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:FileUpload ID = "FileUpload1" runat = "server" />
<asp:Button ID="btn_upload" Text="Upload XML" runat="server" />
</div>
</form>
</body>
</html>
调试
SELECT
语句时,很明显,最后两个交叉应用
语句不会返回任何数据:
CROSS APPLY
TEMPTABLE.quakedetails.nodes('origin/description/text') AS plac(placee)
CROSS APPLY
TEMPTABLE.quakedetails.nodes('origin/description/type') AS typ(typo)
因此,检查您的XML—不知何故,路径origin/description
似乎不存在
如果检查XML,您将看到
节点直接位于
节点下,而不是
节点下,因此请使用以下方法:
CROSS APPLY
TEMPTABLE.quakedetails.nodes('description/text') AS plac(placee)
CROSS APPLY
TEMPTABLE.quakedetails.nodes('description/type') AS typ(typo)
然后,您的查询就可以工作了
更新:您可以通过对.nodes()
函数不执行太多的交叉应用
调用来优化查询-将自己限制为仅使用
节点,然后使用XPath表达式获取该节点内的各个位和片段-尝试此查询:
; WITH XMLNAMESPACES ('http://quakeml.org/xmlns/quakeml/1.2' as q,
default 'http://quakeml.org/xmlns/bed/1.2')
SELECT
Times = XOrigin.value('(time/value)[1]', 'varchar(100)'),
Latitude = XOrigin.value('(latitude/value)[1]', 'numeric(18,6)'),
Longitude = XOrigin.value('(longitude/value)[1]', 'numeric(18,6)'),
Depth = XOrigin.value('(depth/value)[1]', 'numeric(18,6)'),
Magnitude = XEvent.value('(magnitude/value)[1]', 'numeric(18,6)'),
Mag_Type = XEvent.value('(magnitude/type/value)[1]', 'varchar(100)'),
Place = XEvent.value('(description/text)[1]', 'varchar(100)'),
[Type] = XEvent.value('(description/type)[1]', 'varchar(100)')
FROM
@xml.nodes('/q:quakeml/eventParameters/event') as XT1(XEvent)
CROSS APPLY
XEvent.nodes('origin') AS XT2(XOrigin)
这是
选择
唯一-运行速度更快吗?@marc_s,我需要做什么更改?输入数据需要60秒,是我可以用来减少6秒的代码吗?当运行更新的代码时,大小和mag_类型不存储在数据库中,它不起作用,我想我使用了我之前发布的代码
CROSS APPLY
TEMPTABLE.quakedetails.nodes('description/text') AS plac(placee)
CROSS APPLY
TEMPTABLE.quakedetails.nodes('description/type') AS typ(typo)
; WITH XMLNAMESPACES ('http://quakeml.org/xmlns/quakeml/1.2' as q,
default 'http://quakeml.org/xmlns/bed/1.2')
SELECT
Times = XOrigin.value('(time/value)[1]', 'varchar(100)'),
Latitude = XOrigin.value('(latitude/value)[1]', 'numeric(18,6)'),
Longitude = XOrigin.value('(longitude/value)[1]', 'numeric(18,6)'),
Depth = XOrigin.value('(depth/value)[1]', 'numeric(18,6)'),
Magnitude = XEvent.value('(magnitude/value)[1]', 'numeric(18,6)'),
Mag_Type = XEvent.value('(magnitude/type/value)[1]', 'varchar(100)'),
Place = XEvent.value('(description/text)[1]', 'varchar(100)'),
[Type] = XEvent.value('(description/type)[1]', 'varchar(100)')
FROM
@xml.nodes('/q:quakeml/eventParameters/event') as XT1(XEvent)
CROSS APPLY
XEvent.nodes('origin') AS XT2(XOrigin)