【问题标题】:An Object reference is required for the non-static field, method, or property `Program.InsertLogData()` [duplicate]非静态字段、方法或属性“Program.InsertLogData()”需要对象引用 [重复]
【发布时间】:2021-07-09 21:47:08
【问题描述】:

执行建议的代码后,我收到一条错误消息:

An Object reference is required for the non-static field, method, or property Program.InsertLogData()

对于await insertlogdata()的try块

我应该删除 main 中的 static 一词并将其保留为公共异步任务吗?

在给出建议后更新代码:

命名空间 ElasticSearchConsoleApp { 课堂节目 { 私有只读 IElasticClient _elasticClient;

    public Program()
    {
        _elasticClient = new ElasticClient();
    }
    public static async Task Main(string[] args)
    {
        Console.Write("getting connection...");


        try
        {
            await InsertLogData();
        }
        catch(Exception ex)
        {
            Console.Write("Error: " + ex.Message);
        }

        Console.ReadLine();


    }

    public async Task<int> InsertLogData()
    {
        SqlConnection connection = null;
        SqlCommand command = null;
        int numrows = 0;

        try
        {
            var response = await _elasticClient.SearchAsync<Object>(s => s
                .Size(3000)
                .Index("customer-simulation-es-app-logs*")
                .Query(q => +q
                    .DateRange(dr => dr
                        .Field("@timestamp")
                            .GreaterThanOrEquals("2021-06-07T17:13:54.414-05:00")
                            .LessThanOrEquals(DateTime.Now))));

            connection = new SqlConnection("Data Source=.\\SQLExpress;Database=ElasticSearchService;Trusted_Connection=True;");

            connection.Open();

            foreach (var item in response.Hits)
            {
                var id = item.Id;
                var sourceItem = item.Source;

                var json = _elasticClient.RequestResponseSerializer.SerializeToString(sourceItem);

                command = new SqlCommand("INSERT INTO EsLogs (ELKLogID, LogMessage, DateCreated) VALUES ('" + id + "','" + json + "', getdate())", connection);

                numrows = command.ExecuteNonQuery();
            }

            connection.Close();

        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        finally
        {
            command.Dispose();
            connection.Dispose();


        }
        return numrows;
    }

}

}

【问题讨论】:

  • 你需要创建一个IElasticClient _elasticClient的对象,所以你有类似private static IElasticClient _elasticClient = new IElasticClient();
  • 我认为您的弹性客户端为空。您正在使用就像您有依赖注入一样,但似乎您没有。在调用您的方法之前创建一个弹性客户端实例。这不是方法是否静态的问题。
  • 等等我很困惑..我以为我只是从第一行开始private static IElasticClient _elasticClient; 然后有一个覆盖的ctor?
  • 所以如果我在await InsertLogData() 之前添加IElasticClient _elasticClient = new IElasticClient(); 行,它会告诉我“无法创建抽象类型或接口IElasticClient 的实例。我这样做不对吗?@SnowGroomer跨度>
  • 我注意到在我之前的项目中我有private readonly IElasticClient _elasticClient; 而不是private STATIC IElasticClient _elasticClient 这有什么不同吗?

标签: c# elasticsearch asp.net-web-api console-application nest


【解决方案1】:

你必须修复弹性客户端。

private static readonly IElasticClient _elasticClient = new ElasticClient();

//  public Program()
//  {
//  }

在此之后,您将遇到另一个错误。你必须通过放置来修复你的 foreach 循环 循环内的 command.ExecuteNonQuery


 connection.Open();
foreach (var item in response.Hits)
 {
 var id = item.Id;
  var sourceItem = item.Source;
 var json = _elasticClient.RequestResponseSerializer.SerializeToString(sourceItem);

 command = new SqlCommand("INSERT INTO EsLogs (ELKLogID, LogMessage, DateCreated) VALUES ('" + id + "','" + json + "', getdate())", connection);

 numrows = command.ExecuteNonQuery();
}

 connection.Close();

顺便说一句,您必须考虑使用查询参数

【讨论】:

  • 在调用我的方法之前手动调用弹性客户端实例?感谢您发现另一个错误! :) 我将不得不查看我的查询的参数,因为我对此真的很陌生,谢谢你的提醒
  • 在修复第一行代码private readonly IElasticClient _elasticClient 后,在我的InsertLogData() 内部,它不接受_elasticClient 我有.SearchAsync 的地方,也不接受我的var json 它有它的地方告诉我“非静态字段、方法或属性'Program._elasticClient. But when I placed the line IElasticClient _elasticClient = new IElasticClient();'它不喜欢它,当我这样做时它不喜欢它= new IElasticClient
  • @NoviceCoder 你可以试试 _elasticClient = new ElasticClient();在构造函数内部。您不能使用接口创建实例。但恐怕你需要一些参数。
  • 我会更新帖子...请参阅更新部分。在InsertLogData 方法中删除实例时,我仍然收到相同的错误消息。
  • 如果我做错了请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多