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 回答
1

“查询”是 MSSQL 类型。SiteCollection 属性属于 Upserts 类型。尽管您已将 MSSQL 中的 Upserts 类型定义为嵌套类型,但实际上并未在 MSSQL 对象中使用 Upserts 类型(例如,作为属性)。

我能看到启动和运行它的最快方法是将 Upserts 属性添加到您的 MSSQL 类并在您的构造函数中实例化它。

public Upserts Upserts { get; private set; }

然后,您将能够通过以下方式访问该方法:

query.Upserts.SiteCollection("...");

或者,您可以只修改 Upserts 以接收连接字符串并直接实例化它......不过,这是从等式中删除 MSSQL 的一步。

我意识到你写这篇文章是为了让你的头脑围绕类和属性,所以我不会评论这是否是 DAL 的好方法。

于 2013-09-27T01:48:02.793 回答
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 回答