无法理解类和属性

时间:2013-09-27 01:26:00

标签: c# .net class

虽然我知道这是一个简单的问题,而且我的知识存在差距 - 请记住我正在编写此代码以供学习(详细解释或最佳实践建议对此有很大帮助)。

首先,这是我的班级:

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");

但是,这不起作用。我尝试声明该类时遇到的错误是:

  

此时类名无效

我知道在我的知识/班级建设中有一个巨大的差距,这就是原因,但我不知道从哪里开始 - 我思考的错误在哪里?

3 个答案:

答案 0 :(得分:3)

在这行代码中:

var query = new MSSQL(ConnectionString).Upserts;

您实际构建了一个MSSQL类的新实例,然后使用语法,就好像Upserts是您尝试访问它的属性一样。

相反,要实例化您的嵌套类,您应该执行以下操作:

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

<强> BUT ...

将连接字符串存储在封闭类的静态属性中的方式有​​点奇怪,在非静态构造函数中初始化静态属性也很奇怪。

您可能不需要将Upserts作为嵌套类。尝试将它变成一种方法。

此外,您的连接字符串可以存储在实例字段/属性中,而不是静态。

答案 1 :(得分:1)

'query'是MSSQL类型。 SiteCollection属性属于Upserts类型。虽然您已将MSSQL中的Upserts类型定义为嵌套类型,但实际上并未在MSSQL对象中使用Upserts类型(例如,作为属性)。

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

public Upserts Upserts { get; private set; }

然后您可以通过以下方式访问该方法:

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

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

我意识到你正在写这篇文章以包围类和属性,所以我不会评论这是否是DAL的好方法。

答案 2 :(得分: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");