0

C# Dll を別の単純なテスト アプリケーション (コンソール、winform など) にインポートするのに苦労しています。

基本的には、欧州共同体の Vat チェック サービスを使用する巨大なライブラリで構成されています (この URL はVat webserviceであると私は信じています) 。

このサービスでは、ライブラリをダウンロードする必要があり、コードの実装はあなた次第です。

私がしたことは、Visual Studio 2010 で新しい C# クラス ライブラリを開始し、Web サービスから自動的にダウンロードされるこのクラスを追加して、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
                                 };
        }
    }
}

さて、新しいコンソール アプリケーションを作成するときに、ここでリンク/引用した 2 つのクラスを含むクラス ライブラリ プロジェクトからコンパイルされた DLL に参照を追加します (プロジェクト名を右クリックし、参照を追加し、dll を参照します)。

dllを使用しようとしたコードは次のとおりです。

using EuroVAT;

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

            EuroVat test = new EuroVat();


        }
    }
}

基本的に、プログラムから呼び出すことはできません。EuroVAT オブジェクトを呼び出そうとすると得られるのは

エラー 1 タイプまたは名前空間名 'EuroVAT' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

プロジェクトをビルド、クローズ、再開しようとしました。それをWinformsなどに入れようとしましたが、役に立ちませんでした。私はいつもそのエラーを受け取ります。

私は何を間違っていますか?解決するにはどうすればよいですか?

もう 1 つの質問:

このコードは正確に何をしているのでしょうか?

    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
                                 };
        }
    }
}

それが正しいことを願っています。私が見逃しているのは、これらすべてのオブジェクトを SqlInt32、SqlString などの SqlTypes にキャストする方法です。試してみましたが、大量の変換エラーなどが発生しました。それらのオブジェクトと SqlTypes を宣言することはできず、最後の return ステートメントを作成してそれらの 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、 、 などの対応する型の暗黙的な変換演算子があります。ただし、配列はインスタンスを保持するため、暗黙的な変換は適用できません。それが一面です。一方、SQL Server は の結果を取得し、それを処理することはできません。それは方法を知りません。単純な ADO.NET や Entity Framework など、データベースを処理するためにデータ アクセス フレームワークを使用することを検討する必要があると思います。私は実際にあなたが提供したこれらのストアド プロシージャであなたの意図を理解することはできません。SqlStringSqlBinaryintstringobjectobject[]

編集:

次のように結果を 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 に答える