0

我很难将 C# Dll 导入另一个简单的测试应用程序(控制台、winform 等等)。

基本上它包含在一个庞大的图书馆中,该图书馆使用欧共体增值税检查服务(我认为该 URL 是增值税 webservice

该服务让您下载一个库,然后代码的实现由您决定。

我所做的是在 Visual Studio 2010 中启动一个新的 C# 类库,然后添加这个从 web 服务自动下载的类供您自己使用,然后编写我在网上找到的这个片段。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;


namespace EuroVAT
{
    public class EuroVAT
    {
        public static Array check(string country, string vatNum)
        {
            bool valid;
            string name;
            string address;
            checkVatService vatchecker = new checkVatService();
            vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);

            return new object[] {country,
                                 vatNum,
                                 valid,
                                 name,
                                 address
                                 };
        }
    }
}

好吧,当我创建一个新的控制台应用程序时,然后添加一个引用(右键单击项目名称,添加引用,浏览到 dll)到我从类库项目编译的 DLL,其中包括我在这里链接/引用的 2 个类。

这是我尝试使用我的 dll 的一些代码:

using EuroVAT;

namespace DLLTEST
{
    class Program
    {
        static void Main(string[] args)
        {

            EuroVat test = new EuroVat();


        }
    }
}

基本上我无法从程序中调用它们。当我尝试调用 EuroVAT 对象时,我得到的只是

错误 1 ​​找不到类型或命名空间名称“EuroVAT”(您是否缺少 using 指令或程序集引用?)

我试图建立,关闭,重新打开项目。试图把它放在Winforms等无济于事。我总是得到那个错误。

我究竟做错了什么?我能做些什么来解决它?

还有一个问题:

这段代码到底在做什么?

    return new object[] {country,
                         vatNum,
                         valid,
                         name,
                         address
                         };

这就像返回一个对象数组?因为当我运行程序时,所有输出都被抛出。通常我必须通过某种循环来循环输出......

最后一个问题,如果有人可以提供帮助:

我必须将此 DLL 包含在 SQL 服务器中(我认为是 2008 年)

我已经阅读了有关该主题的内容,并发现要将值从 C# dll 传递到 SQL Server,您必须包含各种库并将您的方法声明为 SqlProcedures,而且还要将您的值传递/检索为 SqlTypes(SqlInt32、SqlString 等)。

这是我想出的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace WebServiceVatEuropa
{
    class Program
    {
        [SqlProcedure]
        public static Array check(string country, string vatNum)
        {
            bool valid;
            string name;
            string address;
            checkVatService vatchecker = new checkVatService();
            vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);

            return new object[] {country,
                                 vatNum,
                                 valid,
                                 name,
                                 address
                                 };
        }
    }
}

我希望它是正确的。我缺少的是如何将所有这些对象转换为 SqlTypes,如 SqlInt32、SqlString 等。我试过了,但我得到了大量的转换错误和类似的东西。它只是不允许我在 SqlTypes 中声明这些对象,并且我无法计算出最后一个返回语句来输出这些 SqlTypes。

如果可能的话,谁能举个例子?

谢谢你们。

4

1 回答 1

2
  1. 你的类被声明为EuroVAT. 而你初始化类型的对象EuroVat。检查寄存器 另一件事是,尝试为您的命名空间和类提供不同的名称

  2. 这个: 

    return new object[] {country,
                         vatNum,
                         valid,
                         name,
                         address
    };
    

    创建一个类型数组,并用, ,等object填充它(object)country(object)vatNum(object)valid

  3. 如果我猜对了您打算如何让您的库与 SQL Server 交互,那么问题出在这个数组上。那些 SQL 类型,如SqlInt32, SqlString,SqlBinary等确实具有相应类型的隐式转换运算符,如int, string。但由于数组包含object实例,因此无法应用隐式转换。那是一方面。另一方面,SQL Server 得到的结果object[],它不能只是处理它。它不知道如何。我认为您应该考虑使用数据访问框架来处理数据库,例如普通的 ADO.NET 或实体框架或其他任何东西。我实际上无法通过您提供的这些存储过程弄清楚您的意图。

编辑:

尝试通过这样的方式将结果传递给 SQL Server SqlContext

[SqlProcedure]  
public static void UserService(string country, stringvatNum)    
{       
    object[] serverResponse = CheckService(country, vatNum);

    // Variables.       
    SqlMetaData column1Info;        
    SqlDataRecord record;

    // Create the column metadata.      
    column1Info = new
    SqlMetaData("Column1", SqlDbType.Variant);      

    // Create a new record with the column metadata.       
    record = new SqlDataRecord(new SqlMetaData[]{column1Info});

     // Mark the begining of the result-set.
     SqlContext.Pipe.SendResultsStart(record);

     foreach (var o in serverResponse)      
     {
         record.SetValue(0, o);
         SqlContext.Pipe.SendResultsRow(record);        
     }      

     // Mark the end of  the result-set.        
     SqlContext.Pipe.SendResultsEnd();  
}

public static object[] CheckService(string country, string vatNum)  
{
     bool valid;        
     string name;       
     string address;        
     checkVatService
     vatchecker = new checkVatService();    
     vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);

     return new object[] {country,
                          vatNum,
                          valid,
                          name,
                          address
                         }; 
    }
}
于 2013-07-15T09:31:53.070 回答