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
相关产品推荐
相关产品推荐

