2016-11-30 58 views
8

İyi bir gün web sitemden (PHP) bir XML dosyası almaya çalışıyorum. Bu konuda biraz araştırma yaptım ve bu Passing datatable to a stored procedure'u buldum ama C# için. Yani, göndermek mümkün mü? 22018/206PHP ile XML formatını sql sunucusuna göndermek mümkün mü

: Burada

Ben bu hatayı

Hata Numarası olsun benim yukarıdaki script ile bu şekilde

$xml=simplexml_load_file($file); 
        $HeaderTemp  = array(); 
        $DetailTemp  = array(); 
        $PaymentTemp = array(); 
        $LedgerTemp  = array(); 
        $VoucherTemp = array(); 
        $tambahan = array('session_id' => date('d:h:i:s')); 
        $login = str_replace(' ', '', $this->input->cookie('cookie_webstore_user')); 
        $session = $login.$tambahan['session_id']; 

        foreach ($xml->HeaderTemp as $HeaderTempnya) 
           { 
            $HeaderTemp[] = $HeaderTempnya; 
           } 
          foreach ($xml->DetailTemp as $DetailTempnya) 
           { 
            $DetailTemp[] = $DetailTempnya; 
           } 
          foreach($xml->PaymentTemp as $PaymentTempnya) 
           { 
            $PaymentTemp[] = $PaymentTempnya; 
           } 
          foreach($xml->LedgerTemp as $LedgerTempnya) 
           { 
            $LedgerTemp[] = $LedgerTempnya; 
           } 
          foreach($xml->VoucherTemp as $VoucherTempnya) 
           { 
            $VoucherTemp[] = $VoucherTempnya; 
           }   

        if($VoucherTempnya != ""){ 
        $this->modelmodel->showsingle("[InsertSALESPOS] '{$HeaderTemp}','{$DetailTemp}','{$PaymentTemp}','{$VoucherTemp}','{$LedgerTemp}'"); 
        }else{ 
        $this->modelmodel->showsingle("[InsertSALESPOS] '{$HeaderTemp}','{$DetailTemp}','{$PaymentTemp}','','{$LedgerTemp}'"); 
        } 

deneyin benim saklı Yordam

USE [sales_web] 
GO 
/****** Object: StoredProcedure [dbo].[InsertSALESPOS] Script Date: 11/30/2016 09:19:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


ALTER PROCEDURE [dbo].[InsertSALESPOS] 

@HeaderTemp HeaderTemp readonly,     
@DetailTemp DetailTemp readonly,     
@PaymentTemp PaymentTemp readonly,     
@VoucherTemp VoucherTemp readonly,     
@LedgerTemp LedgerTemp readonly     

AS     
BEGIN   

set nocount on; 

begin try     
begin transaction     

select ID, TransactionNo, TransactionDate, TotalTransaction, LocationID, UserID, CustomerCode, SendStatus  
into #HeaderTemp from @HeaderTemp    
where TransactionNo not in(SELECT TransactionNo from TransactionHeader with(nolock))     

    INSERT INTO dbo.SalesOrderHeader (TransactionNo, DocumentNo, TransDate, ETADate, ExternalDocument, Reference, RefTransNo, Category, CustomerCode, Remark, Remark2, TermOfPayment,     
    Currency, Rate, UseVAT, SubTotal, DiscPercent, DiscAmount, GrandTotal, TotalReceivable, FromCustomerCode, PostingStatus, PostingBy, PostingDate, CreatedDate, CreatedBy, ModifiedDate,     
    ModifiedBy, CustomerReceivable, LocationCode, VatPercent, VatAmount, FinalReleasedDate_Outlet)     
select h.TransactionNo, h.TransactionNo as DocumentNo, cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as TransDate,     
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as ETADate, '' as ExternalDocument, '' as Reference, '' as RefTransNo,     
    'POS' as Category, h.CustomerCode, '' as Remark, '' as Remark2, Cast('' as Datetime) as TermOfPayment, 'IDR' as Currency, Cast(1 as Float) as Rate,     
    Cast(0 as Bit) as UseVAT, Cast(SUM(d.TotalAmountAfterDisc) as Float) as SubTotal, Cast(0 as Float) as DiscPercent, Cast(0 as Float) as DiscAmount,     
    Cast(SUM(d.TotalAmountAfterDisc) as Float) as GrandTotal, Cast(SUM(d.TotalAmountAfterDisc) as Float) as TotalReceivable,     
    h.CustomerCode as FromCustomerCode, Cast(0 as Bit) as PostingStatus, '' as PostingBy, Cast('' as Datetime) as PostingDate,     
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as CreatedDate, h.UserID as CreatedBy,     
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as ModifiedDate, h.UserID as ModifiedBy, h.CustomerCode as CustomerReceivable,     
    h.CustomerCode as LocationCode, Cast(0 as Float) as VatPercent, Cast(0 as Float) as VatAmount, cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as FinalReleasedDate_Outlet     
    from @HeaderTemp h     
    Inner Join @DetailTemp d on h.id = d.TransactionID and h.CustomerCode = d.CustomerCode     
Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))     
    Group By h.TransactionNo, TransactionDate , h.CustomerCode, h.UserID     

    Insert Into dbo.SalesOrderDetail     
SELECT h.TransactionNo + '-' + Cast(ROW_NUMBER() Over(Order By h.TransactionNo) as Varchar) as TransactionNo, h.TransactionNo as SalesOrderTransNo,     
    h.TransactionNo as RefTransNo, (ROW_NUMBER() Over(Order By h.TransactionNo))*1000 as [LineNo], isnull(d.ItemCode,''), d.Quantity, isnull(d.MainUOMCode,'') as UOM,     
    d.UnitPrice, 0 as DiscountPercent, 0 as VatPercent, (d.Quantity*d.UnitPrice) as AmountPrice,     
    ((d.Quantity*d.UnitPrice)-d.TotalAmountAfterDisc) as AmountDiscount, 0 as AmountVat,     
    d.TotalAmountAfterDisc as Total, d.TotalAmountAfterDisc as Receivable,     
d.UnitPrice as UnitPriceAfterReceivable, '' as ExtraRemark, '' as ExtraRemark2,      
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as CreatedDate, h.UserID as CreatedBy,      
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as ModifiedDate, h.UserID as ModifiedBy     
    from @HeaderTemp h      
    Inner Join @DetailTemp d on h.id = d.TransactionID and h.CustomerCode = d.CustomerCode     
Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))      

    Insert Into dbo.SalesOrderPayment     
Select h.TransactionNo + '-' + Cast(ROW_NUMBER() Over(Order By h.TransactionNo) as Varchar) as TransactionNo, h.TransactionNo as SalesOrderTransNo,     
    p.PaymentMethodCode, p.TotalDue, p.TotalTendered     
    From @HeaderTemp h     
    Left Join @PaymentTemp p on h.id = p.TransactionID     
    and h.CustomerCode = p.CustomerCode     
    Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))     
--cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime)     

    Insert Into dbo.SalesOrderVoucher     
Select h.TransactionNo + '-' + Cast(ROW_NUMBER() Over(Order By h.TransactionNo) as Varchar) as TransactionNo, h.TransactionNo as SalesOrderTransNo,     
    v.VoucherVendor as Voucher, Case When v.VoucherType = '1' Then 'NOMINAL' Else 'PERCENT' End as VoucherType, v.VoucherValue, v.VoucherAmount     
    From @HeaderTemp h     
    Left Join @VoucherTemp v On h.CustomerCode = v.CustomerCode And h.ID = v.TransactionID     
Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))  

    Insert Into dbo.ItemLedgerEntry(TransactionNo, SequenceNo, DocumentNo, EntryType,      
CustomerCode, ItemCode, PostingDate, Quantity, UomCode, CreatedDate, CreatedBy)     
Select TransactionNo, SequenceNo, DocumentNo, EntryType,     
CustomerCode, ItemCode, cast(left(PostingDate,len(PostingDate)-6) as datetime) as PostingDate, Cast(Quantity as Float) as Quantity, UomCode, cast(left(CreatedDate,len(CreatedDate)-6) as datetime) as CreatedDate, CreatedBy      
    From @LedgerTemp     
Where DocumentNo in (select Transactionno from #HeaderTemp with(nolock))     



drop table #HeaderTemp     
Select 'Succes' as [Status] 
commit transaction     
end try     
begin catch     
rollback       
    insert into XMLLOGERROR values(getdate(), 'SALESPOS', ERROR_MESSAGE()) 
end catch     
end  

olduğunu

[Microsoft] [SQL Server Yerel İstemcisi 10.0 ] [SQL Server] İşlenen tür çakışmasından: : D:/xampp/htdocs/varchar HeaderTemp

[InsertSALESPOS] 'Dizi', 'Dizi', 'Dizi', '', 'Dizi'

Resim ile uyumsuz new_store/sistem/veritabanı/DB_driver.php

Hat sayısı: benim kötü İngiliz 691

üzgünüm.

Tamam. Problemimi farklı yollarla çözdüm. Eğer imkansızsa, sadece merak ediyorum, lütfen nedenini açıklayın.

+2

Ben PHP inanmıyorum içinde geçerli değerini kullanarak her döngüde ekleme deyimini yürütmek çalıştığınız dizi TVP destekler olmalıdır. XML veya bir dizgeyi geçirmeniz ve SQL'in onu ayrıştırmanız ve sorgularınız için tablolara ayırmanız gerektiğine inanıyorum. – ZLK

+0

Bu bağlantının şu ana kadar faydalı olacağını umuyorum http://stackoverflow.com/questions/2060599/php-sql-server-table-value-parameter/2060793#2060793 – SergeyLebedev

+0

@SergeyLebedev – YVS1102

cevap

-1

Doğrudan MySQL üzerinden yerleştirilebildiği için PHP'yi kullanmak zorunda değilsiniz. geçmesi, sql sunucusunda bir tabloya xml yük daha fazla bilgi için için openrowset komutla MySQL Dokümanlar here

+5

SQL Server! = MySQL – Leith

2

mümkündür okumak Yükleme XML verileriyle ilgili diğer bilgiler için

LOAD XML LOCAL INFILE '/pathtofile/file.xml' 
INTO TABLE my_tablename(col1, col2, ...); 

gibi komut olurdu link https://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/

+0

Yani, php ile nasıl gönderiyorsunuz? – YVS1102

+0

Bu sql deyimlerini, saklı yordamına parametre olarak dosya adıyla yazın ve ardından php'den çağırın. –

0

Alan türü bir varchar olarak tanımlanmış bir alan için bir değer olarak kullanmaya çalıştığınız gibi görünüyor.

Sen döngü gerçek artık insert için kullanmak ve döngü

+0

evet. Biliyorum. Bunu yaptım. XML formatında gönderebilir miyim. – YVS1102