0

これは簡単な問題であり、知識のギャップであることはわかっていますが、このコードは学習のために書いていることを覚えておいてください (詳細な説明やベスト プラクティスの提案は、これに大いに役立ちます)。

まず、ここに私のクラスがあります:

namespace CCQ.Crawler._2010
{
    public class MSSQL
    {
        public MSSQL(string connectionString)
        {
            ConnectionString = connectionString;
        }

        public static string ConnectionString { get; private set; }

        /// <summary>
        /// Class to house statements that insert or update data into the database
        /// </summary>
        public class Upserts
        {
            /// <summary>
            /// Add or update a new entry on the site collection table
            /// </summary>
            /// <param name="siteCollectionName"></param>
            public void SiteCollection(string siteCollectionName)
            {
                const string queryString =
                @"INSERT INTO [dbo].[SiteCollections]
                                   ([SnapShotDate]
                                   ,[SiteCollectionName]
                                   ,[SiteWebCount]
                                   ,[ContentDatabase]
                                   ,[SiteWebApplication])
                                 VALUES
                                  (@snapShotDate, @siteCollectionName, @siteWebCount, @contentDatabase, @siteWebApplication)";
                using (var connection = new SqlConnection(ConnectionString))
                {
                    using (var cmd = new SqlCommand(queryString, connection))
                    {
                        connection.Open();

                        cmd.Parameters.AddWithValue("snapShotDate", DateTime.Today.Date);
                        cmd.Parameters.AddWithValue("siteCollectionName", siteCollectionName);

                        cmd.ExecuteNonQuery();
                    }
                }
            }
        }
    }
}

そして、ここに私のメインプログラムファイルがあります:

namespace CCQ.Crawler._2010
{
    internal class Program
    {
        private static string _connectionString;
        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();

        public static string ConnectionString
        {
            get
            {
                if (string.IsNullOrEmpty(_connectionString))
                {
                    _connectionString = AES.DecryptFromBase64String(ConfigurationManager.AppSettings["DatastoreConnection"]);
                }
                return _connectionString;
            }
        }

        static void Main(string[] args)
        {

            string version = Assembly.GetAssembly(typeof(Program)).GetName().Version.ToString();

            Console.WriteLine("[{0}] SharePoint Crawler started with version '{1}'.", DateTime.Now.ToShortTimeString(), version);
            Logger.Info(string.Format("[{0}] SharePoint Crawler started with version '{1}'.", DateTime.Now.ToShortTimeString(), version));

            try
            {
                var query = new MSSQL(ConnectionString);


            }
            catch (Exception ex)
            {
                Logger.Error(String.Format("[{0}] {1}", DateTime.Now.ToShortTimeString(), ex.GetBaseException()));
                Console.WriteLine("[{0}] {1}", DateTime.Now.ToShortTimeString(), ex.GetBaseException());
            }
        }
    }
}

このクラスでできると思ったのは、次のとおりです。

var query = new MSSQL(ConnectionString).Upserts;

query.SiteCollection("testing");

しかし、まあ、それはうまくいきません。クラスを宣言しようとすると発生するエラーは次のとおりです。

この時点で、クラス名は無効です

私の知識/クラス構築のどこかに大きなギャップがあることは知っていますが、それが理由ですが、どこから始めればよいのかよくわかりません-私の考えのどこにエラーがありますか?

4

3 に答える 3

3

このコード行では:

var query = new MSSQL(ConnectionString).Upserts;

実際には、MSSQL クラスの新しいインスタンスを構築し、Upsertsアクセスしようとしているプロパティであるかのように構文を使用しています。

代わりに、ネストされたクラスをインスタンス化するには、次のようにする必要があります。

var mssql = new MSSQL("your connection string");
var query = new MSSQL.Upserts();

しかし...

外側のクラスの静的プロパティに接続文字列を格納する方法は少し奇妙で、非静的コンストラクタで静的プロパティを初期化するのも奇妙です。

Upsertsおそらく、ネストされたクラスである必要はありません。代わりにメソッドにしてみてください。

また、接続文字列は、静的ではなく、インスタンス フィールド/プロパティに格納できます。

于 2013-09-27T01:33:12.433 に答える
0

この場合、ネストされたクラスを使用する必要はないと思います。あなたはこれを試すことができます:

/// <summary>
/// <para>MSSQL class</para>
/// </summary>
public class MSSQL
{
    #region Class field declaration

    private string f_connectionString;

    #endregion

    #region Public method

    /// <summary>
    /// <para>Static method for getting the class instance.</para>
    /// </summary>
    /// <param name="p_connectionString">MSSQL connection string</param>
    /// <returns><see cref="MSSQL"/></returns>
    public static MSSQL Create(string p_connectionString)
    {
        return new MSSQL(p_connectionString);
    }

    public void SiteCollection(string p_siteCollectionName)
    {
        //Your Logic here.
    }

    #endregion


    #region Constructor
    /// <summary>
    /// <para>Hide the default constructor</para>
    /// </summary>
    private MSSQL()
    {

    }

    /// <summary>
    /// <para>Private constructor for Static method</para>
    /// </summary>
    /// <param name="p_connectionString">MSSQL connection string</param>
    private MSSQL(string p_connectionString)
    {
        this.f_connectionString = p_connectionString;
    }
    #endregion
}

このコードでは、次の方法でこのクラスのインスタンスを作成できます。

var instance = MSSQL.Create("ConnectionString");

次の方法で SiteCollection を取得します。

var siteCollection = instance.SiteCollection("Testing");
于 2013-09-27T01:54:06.393 に答える