虽然我知道这是一个简单的问题,而且我的知识存在差距 - 请记住我正在编写此代码以供学习(详细解释或最佳实践建议对此有很大帮助)。
首先,这是我的班级:
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");
但是,这不起作用。我尝试声明该类时遇到的错误是:
此时类名无效
我知道在我的知识/班级建设中有一个巨大的差距,这就是原因,但我不知道从哪里开始 - 我思考的错误在哪里?
答案 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");