You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#静态Main调用非静态InsertLogData报对象引用错误如何解决?

问题核心原因

你不能通过去掉Main方法的static修饰符解决该问题,C#控制台应用的入口点Main方法必须为静态方法,这是.NET运行时的硬性要求,修改后会直接失去合法入口点,编译阶段就会报错。
你遇到的报错本质是:InsertLogData是Program类的实例方法,依赖Program类的实例成员_elasticClient,而静态方法Main不能直接调用非静态的实例成员,必须先创建Program类的实例。

正确修改方案

只需要调整Main方法中的代码,先实例化Program对象再调用方法即可:

public static async Task Main(string[] args)
{
    Console.Write("getting connection...");
    // 新增实例化代码
    var programInstance = new Program();
    try
    {
        // 改为通过实例调用方法
        await programInstance.InsertLogData();
    }
    catch(Exception ex)
    {
        Console.Write("Error: " + ex.Message);
    }
    Console.ReadLine();
}

额外代码优化建议

你的现有代码还存在几个可优化的风险点:

  • SQL注入风险:直接拼接SQL字符串的写法存在严重的注入漏洞,建议改为参数化查询:
command = new SqlCommand("INSERT INTO EsLogs (ELKLogID, LogMessage, DateCreated) VALUES (@id, @json, getdate())", connection);
command.Parameters.AddWithValue("@id", id);
command.Parameters.AddWithValue("@json", json);
  • 资源释放风险:手动调用Dispose容易在异常时出现空引用,建议用using块自动释放资源,不需要手动写Dispose和关闭连接的逻辑:
using var connection = new SqlConnection("Data Source=.\\SQLExpress;Database=ElasticSearchService;Trusted_Connection=True;");
await connection.OpenAsync();
foreach (var item in response.Hits)
{
    var id = item.Id;
    var sourceItem = item.Source;
    var json = _elasticClient.RequestResponseSerializer.SerializeToString(sourceItem);
    using var command = new SqlCommand("INSERT INTO EsLogs (ELKLogID, LogMessage, DateCreated) VALUES (@id, @json, getdate())", connection);
    command.Parameters.AddWithValue("@id", id);
    command.Parameters.AddWithValue("@json", json);
    numrows += await command.ExecuteNonQueryAsync();
}
  • 原代码的numrows变量每次都会被覆盖,只会统计最后一行的插入结果,改成+=可以统计总插入行数。

内容的提问来源于stack exchange,提问作者NoviceCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:06:03