SQL Server 中的电子发票二维码 TLV Base64 字符串 |扎特卡 |税务发票|沙特阿拉伯王国

发布于 2025-01-16 04:43:25 字数 2381 浏览 2 评论 0原文

#e-Invoice #Tax-Invoice #KSA-Invoice #SQL-Server-E-Invoice #ZATCA

如何在 SQL Server 中生成基于 TLV 的 64 字符串?下面的代码在 C# 中运行良好,但就我而言,我需要在 SQL Server 中生成相同的字符串。

有一种方法可以在 SQL 过程中使用 DLL/COM 在 SQL Server 进程之外运行基于 DLL 的 COM 对象,但由于安全问题和其他问题而避免这样做。

基本上,有两种在 SQL 中进行转换的方法

  1. public String ConvertBase64(String sellername, String vatregistration, String timestamp, string invoiceamount,String vatamoun)

  2. 公共字节[] ConvertTLV(字符串tagnums,字符串tagvalue)

    公共分部类 Form1 : Form
    {
        公共表格1()
        {
            初始化组件();
        }
    
        私人无效Form1_Load(对象发送者,EventArgs e)
        {
    
        }
    
        公共字符串GenerateAndGetString()
        {
    
            var sellername = " 卖家名称";
            var vatregistration =“810866391234567”;
            var 时间戳 = "2020-03-22 10:16:14";
            var 发票金额 = "1000.00";
            var vatamoun =“150.00”;
    
            返回 ConvertBase64(卖家名称、vatregistration、时间戳、invoiceamount、vatamoun);
        }
    
        公共字符串ConvertBase64(字符串卖家名称,字符串vatregistration,字符串时间戳,字符串发票金额,
            弦瓦塔蒙)
        {
            字符串 ltr = ((char)0x200E).ToString();
            var seller = ConvertTLV("1", 卖家名称);
            var vatno = ConvertTLV("2", vatregistration);
            var time = ConvertTLV("3", 时间戳);
            var invamt = ConvertTLV("4", 发票金额);
            var vatamoun = ConvertTLV("5", vatamoun);
            var result = seller.Concat(vatno).Concat(time).Concat(invamt).Concat(vatamt).ToArray();
            Console.WriteLine(结果);
            Console.WriteLine(结果.ToString());
            var 输出 = Convert.ToBase64String(结果);
            Console.WriteLine(输出);
            返回输出;
        }
    
    
    
        公共字节[] ConvertTLV(字符串标记值,字符串标记值)
        {
            字符串[] tagnums_array = { tagnums };
            var 标签值1 = 标签值;
            var tagnum = tagnums_array.Select(s => Byte.Parse(s)).ToArray();
            var tagvalueb = System.Text.Encoding.UTF8.GetBytes(tagvalue1);
            string[] taglengths = { tagvalueb.Length.ToString() };
            var tagvaluelengths = taglengths.Select(s => Byte.Parse(s)).ToArray();
            var tlvVALue = tagnum.Concat(tagvaluelengths).Concat(tagvalueb).ToArray();
    
    
            返回 tlvVALue;
        }
    
        私人无效button1_Click(对象发送者,EventArgs e)
        {
            //在此处生成并获取输出字符串
            textBox1.Text=GenerateAndGetString();
        }
    }
    
#e-Invoice #Tax-Invoice #KSA-Invoice #SQL-Server-E-Invoice #ZATCA

how do I generate TLV based64 string in SQL Server? below code works well in C# but in my case, I need to generate the same string in SQL Server.

there is a way around that I can use DLL/COM in SQL Procedure Run a DLL-based COM object outside the SQL Server process but avoiding this due to security issues and other concerns.

Basically, two methods to be converted in SQL

  1. public String ConvertBase64(String sellername, String vatregistration, String timestamp, string invoiceamount,String vatamoun)

  2. public byte[] ConvertTLV(String tagnums, String tagvalue)

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
    
        }
    
        public String GenerateAndGetString()
        {
    
            var sellername = " حسيب احمد";
            var vatregistration = "810866391234567";
            var timestamp = "2020-03-22 10:16:14";
            var invoiceamount = "1000.00";
            var vatamoun = "150.00";
    
            return ConvertBase64(sellername, vatregistration, timestamp, invoiceamount, vatamoun);
        }
    
        public String ConvertBase64(String sellername, String vatregistration, String timestamp, String invoiceamount,
            String vatamoun)
        {
            string ltr = ((char)0x200E).ToString();
            var seller = ConvertTLV("1", sellername);
            var vatno = ConvertTLV("2", vatregistration);
            var time = ConvertTLV("3", timestamp);
            var invamt = ConvertTLV("4", invoiceamount);
            var vatamt = ConvertTLV("5", vatamoun);
            var result = seller.Concat(vatno).Concat(time).Concat(invamt).Concat(vatamt).ToArray();
            Console.WriteLine(result);
            Console.WriteLine(result.ToString());
            var output = Convert.ToBase64String(result);
            Console.WriteLine(output);
            return output;
        }
    
    
    
        public byte[] ConvertTLV(String tagnums, String tagvalue)
        {
            string[] tagnums_array = { tagnums };
            var tagvalue1 = tagvalue;
            var tagnum = tagnums_array.Select(s => Byte.Parse(s)).ToArray();
            var tagvalueb = System.Text.Encoding.UTF8.GetBytes(tagvalue1);
            string[] taglengths = { tagvalueb.Length.ToString() };
            var tagvaluelengths = taglengths.Select(s => Byte.Parse(s)).ToArray();
            var tlvVAlue = tagnum.Concat(tagvaluelengths).Concat(tagvalueb).ToArray();
    
    
            return tlvVAlue;
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            //GENEARING AND GETTING OUTPUT STRING HERE
            textBox1.Text=GenerateAndGetString();
        }
    }
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

万劫不复 2025-01-23 04:43:25

我在 SQL Server 中做了这个解决方案:
——**************************************************** **********************************

Begin Try  Drop FUNCTION StringToBase64_Func End Try Begin Catch End Catch 
Go --xxxxx

CREATE FUNCTION StringToBase64_Func(@InputString VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) AS
BEGIN
  RETURN (
    SELECT CAST(@InputString as varbinary(max)) FOR XML PATH(''), BINARY BASE64 
  ) 
END

Go --xxxxx
-- ************************************************************************************

IF exists (select [name] from sysobjects Where [name] = 'SalesTaxVio') BEGIN  Drop View SalesTaxVio END 
Go --xxxxx

Create View SalesTaxVio As 

Select H.*, CONVERT(varchar(250), CN.SValue) As CompanyName, CONVERT(varchar(250), TN.SValue) As CompanyTaxNumber, 
       CONVERT(varchar(50), CONVERT(datetime, CONVERT(date, H.TrxDate)) + CONVERT(datetime, CONVERT(time, IsNull(H.TrxTime, 0))), 127) As TrxDateTime, 
       CONVERT(varchar(50), H.TrxAmount) As TrxAmountStr, CONVERT(varchar(50), H.TaxValue) As TaxValueStr 
From   saTrxHeader H 
  LEFT OUTER JOIN Settings CN on CN.SName = 'CompanyName' 
  LEFT OUTER JOIN Settings TN on TN.SName = 'CompanyTaxNumber' 

Go --xxxxx
-- ************************************************************************************

IF exists (select [name] from sysobjects Where [name] = 'saTrxHeaderTaxVio') BEGIN  Drop View saTrxHeaderTaxVio END 
Go --xxxxx

Create View saTrxHeaderTaxVio As 

Select H.*, 
       dbo.StringToBase64_Func(CONVERT(varbinary(1564), 
       '01' + convert(nvarchar, convert(varbinary(1), Len(H.CompanyName       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.CompanyName       ), 2) + 
       '02' + convert(nvarchar, convert(varbinary(1), Len(H.CompanyTaxNumber  )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.CompanyTaxNumber  ), 2) + 
       '03' + convert(nvarchar, convert(varbinary(1), Len(H.TrxDateTime       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TrxDateTime       ), 2) + 
       '04' + convert(nvarchar, convert(varbinary(1), Len(H.TrxAmountStr      )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TrxAmountStr      ), 2) + 
       '05' + convert(nvarchar, convert(varbinary(1), Len(H.TaxValueStr       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TaxValueStr       ), 2) 
       , 2)) As TaxQRCode 
From   SalesTaxVio H 

Go --xxxxx
-- ************************************************************************************

但仅适用于公司名称中的拉丁字符。
如果公司名称包含阿拉伯字符,则不起作用。

i have made this solution in SQL Server :
-- ************************************************************************************

Begin Try  Drop FUNCTION StringToBase64_Func End Try Begin Catch End Catch 
Go --xxxxx

CREATE FUNCTION StringToBase64_Func(@InputString VARCHAR(MAX)) 
RETURNS VARCHAR(MAX) AS
BEGIN
  RETURN (
    SELECT CAST(@InputString as varbinary(max)) FOR XML PATH(''), BINARY BASE64 
  ) 
END

Go --xxxxx
-- ************************************************************************************

IF exists (select [name] from sysobjects Where [name] = 'SalesTaxVio') BEGIN  Drop View SalesTaxVio END 
Go --xxxxx

Create View SalesTaxVio As 

Select H.*, CONVERT(varchar(250), CN.SValue) As CompanyName, CONVERT(varchar(250), TN.SValue) As CompanyTaxNumber, 
       CONVERT(varchar(50), CONVERT(datetime, CONVERT(date, H.TrxDate)) + CONVERT(datetime, CONVERT(time, IsNull(H.TrxTime, 0))), 127) As TrxDateTime, 
       CONVERT(varchar(50), H.TrxAmount) As TrxAmountStr, CONVERT(varchar(50), H.TaxValue) As TaxValueStr 
From   saTrxHeader H 
  LEFT OUTER JOIN Settings CN on CN.SName = 'CompanyName' 
  LEFT OUTER JOIN Settings TN on TN.SName = 'CompanyTaxNumber' 

Go --xxxxx
-- ************************************************************************************

IF exists (select [name] from sysobjects Where [name] = 'saTrxHeaderTaxVio') BEGIN  Drop View saTrxHeaderTaxVio END 
Go --xxxxx

Create View saTrxHeaderTaxVio As 

Select H.*, 
       dbo.StringToBase64_Func(CONVERT(varbinary(1564), 
       '01' + convert(nvarchar, convert(varbinary(1), Len(H.CompanyName       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.CompanyName       ), 2) + 
       '02' + convert(nvarchar, convert(varbinary(1), Len(H.CompanyTaxNumber  )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.CompanyTaxNumber  ), 2) + 
       '03' + convert(nvarchar, convert(varbinary(1), Len(H.TrxDateTime       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TrxDateTime       ), 2) + 
       '04' + convert(nvarchar, convert(varbinary(1), Len(H.TrxAmountStr      )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TrxAmountStr      ), 2) + 
       '05' + convert(nvarchar, convert(varbinary(1), Len(H.TaxValueStr       )), 2) + convert(nvarchar(1000), convert(varbinary(500), H.TaxValueStr       ), 2) 
       , 2)) As TaxQRCode 
From   SalesTaxVio H 

Go --xxxxx
-- ************************************************************************************

but only works with Latin characters in company name.
if company name contains Arabic characters it does not work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文