大叔, 你OUT了

单身汉第一天。

昨晚寻觅吃饭的地方, 就趁着夜色, 吹着晚风,来到了某大学中南分校。

校门口的小吃摊人头攒动,望不到鞭。

鄙人就要了点这个和那个, 坐在一堆学生中,很突兀的吃起来。

其实鄙人是想说鹤立鸡群的,想想还是算了,鄙人还没成鹤,周围的学生大部分也不是鸡。

但为何就觉得突兀呢?其实在三四年前, 走在校园, 还偶尔有问路的人称呼鄙人为“同学”的。

望着周围一张张青春的脸,耳朵充斥着90后自信的笑,鄙人悲哀的找到了原因:李哥哥,你老了。

正在惆怅时,听到旁边两个女生的对话:

女生甲:kao, 好大一碗。

女生乙:kao, 太猛了。

女生甲:kao,吃饱后不能伸懒腰的,我妈妈说这样会把肠子拉断。。。。。。

......

鄙人当时确实忍了, 但确实没忍住。

鄙人就这样把鼻涕给喷了出来,当着那两个女生的面!

其实鄙人一向是温文尔雅的,要怪就怪那个麻辣烫也忒辣了,再加上这么挫的对话!!

鄙人掏出手纸, 尽量把擦鼻涕的动作做到温文尔雅。

快速的端起我的麻辣烫,转身,走掉。

在她们眼里,一定是很猥琐的转身, 走掉。

 

在走掉的时候,鄙人很悲哀的思考着:

现在的90后都进化到如此地步了吗?

还是女生, 就言必称KAO,头发跟山鸡一样染黄, 违背牛顿定律往上冲,伸懒腰会把肠子拉断......

 

哎,大叔, 你是真的OUT了!

using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PackingApp.Services { public class Logic { private DataRow[] _Rows; public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); private string dbConnectString = ConfigurationManager.AppSettings["Conn"].ToString(); public static OracleDBHelper dbHelper = new OracleDBHelper(dbConnectString); public static bool IsNewYear(string lastBoxNumber) { if (string.IsNullOrEmpty(lastBoxNumber) || lastBoxNumber.Length < 6) return true; // 如果格式不对,默认重新开始 string yearPart = lastBoxNumber.Substring(3, 2); // 取第4和5位作为年份 int boxYear = int.Parse(yearPart); int currentYear = DateTime.Now.Year % 100; // 当前年份后两位 return boxYear < currentYear; } public static async Task<DateTime> GetSysTime() { try { return DateTime.Parse((await dbHelper.ExecuteQueryAsync("SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL")).Rows[0][0].ToString()); } catch { return DateTime.Now; } } private bool ProcessSystemMacro(string[] param, out string value) { value = null; bool flag = false; int num = 1; DateTime dateTime = GetSysTime(); if (value != null) { return true; } string text = _Rows[0]["PRODTYPE"].ToString().Split('|').Last(); switch (param[0]) { case "YYYY": value = dateTime.ToString("yyyy"); break; case "YY": value = dateTime.ToString("yy"); break; case "Y": value = dateTime.ToString("y"); break; case "MM": value = dateTime.ToString("MM"); break; case "DD": if (flag) { value = $"{dateTime.Day:00}"; } else { value = dateTime.ToString("dd"); } break; case "DDD": value = dateTime.DayOfYear.ToString(); while (value.Length < 3) { value = "0" + value; } break; case "WEEK": { Calendar calendar = CultureInfo.InvariantCulture.Calendar; value = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString(); break; } case "DOW": value = dateTime.DayOfWeek.ToString(); break; case "GEELYLOT": if (flag) { value = $"{dateTime:yyMM}{2 * (dateTime.Day - 1) + num:00}"; } break; case "ERPTAG": { string text2 = (_Rows[1].Table.Columns.Contains("SUFFIX") ? _Rows[1]["SUFFIX"].ToString() : ""); string text3 = string.Join("-", (!string.IsNullOrEmpty(_Rows[2]["ERP_PARTNO"] as string)) ? new string[3] { _Rows[2]["line"].ToString(), _Rows[2]["ERP_PARTNO"].ToString(), _Rows[1]["PACKID"].ToString().Replace("|", string.Empty) } : new string[3] { _Rows[2]["line"].ToString(), _Rows[2]["PARTNO"].ToString(), _Rows[1]["PACKID"].ToString().Replace("|", string.Empty) }); string text4 = "FGLABEL2"; string text5 = (string.IsNullOrEmpty(_Rows[2]["ERP_PARTNO"] as string) ? (_Rows[2]["PARTNO"].ToString() + text2) : (_Rows[2]["ERP_PARTNO"].ToString() + text2)); string empty = string.Empty; string empty2 = string.Empty; string text6 = _Rows[1]["CURRQUANTITY"].ToString(); string empty3 = string.Empty; string text7 = Process(new string[1] { "PLOT" }); string text8 = string.Empty; string empty4 = string.Empty; string text9 = _Rows[2]["rev"].ToString(); value = "(" + string.Join("|", text3, text4, text5, empty, empty2, text6, empty3, text8, empty4, text9) + ")"; string text10 = "insert into acc_pack_tag(ctime, packid, tag_name, tag_value) values(sysdate, :1, 'AssociatedERPTAG', :2)"; try { dbHelper.ExecuteNonQuery(text10, _Rows[1]["PACKID"].ToString(), value); } catch (Exception ex) { loginfo.Info(string.Format("Exception on executing: {0} with packid({1}) and value({2}) as below{3} {4}", text10, _Rows[1]["PACKID"], value, Environment.NewLine, ex.ToString())); } break; } default: return false; } return true; } public string Process(string[] param) { param[0] = param[0].ToUpper(); if (ProcessSystemMacro(param, out var value)) { return value; } try { string text = ((_Rows.Length > 1 && _Rows[1].Table.Columns.Contains("SUFFIX")) ? _Rows[1]["SUFFIX"].ToString() : ""); string text2 = _Rows[0]["PRODTYPE"].ToString().Split('|').Last(); for (int i = 0; i < _Rows.Length; i++) { if (_Rows[i].Table.Columns.Contains(param[0])) { if (param[0] == "PARTNO") { return string.Concat(_Rows[i][param[0]], text); } return _Rows[i][param[0]].ToString(); } if (_Rows[i].Table.Columns.Contains(text2 + "|" + param[0])) { return _Rows[i][text2 + "|" + param[0]].ToString(); } } } catch { return param[0]; } return param[0]; } public class ScanItem { public int Index { get; set; } public string PackID { get; set; } public DateTime PackDate { get; set; } public string PackBarcode { get; set; } } public class PackInfo { public string PackId { get; set; } public string PackSize { get; set; } } } } 字段初始值设定项无法引用非静态字段、方法或属性“Logic.dbConnectString”无法将类型“System.Threading.Tasks.Task<System.DateTime>”隐式转换为“System.DateTime”“ExecuteNonQuery”方法没有采用 3 个参数的重载
09-04
<think> 我们正在解决三个C#编译错误: 1. 字段初始值设定项无法引用非静态字段、方法或属性“Logic.dbConnectString” 2. 无法将类型“System.Threading.Tasks.Task<System.DateTime>”隐式转换为“System.DateTime” 3. “ExecuteNonQuery”方法没有采用3个参数的重载 我们将逐一分析并提供解决方案。 ### 错误1: 字段初始值设定项无法引用非静态字段、方法或属性“Logic.dbConnectString” 这个错误通常发生在尝试在字段初始化式中使用实例成员(非静态成员)时。在C#中,字段初始值设定项(即在声明字段的同时进行赋值)只能使用静态成员,因为此时实例还没有完全创建。 假设我们有类似这样的代码: ```csharp public class MyClass { private string connectionString = Logic.dbConnectString; // 这里出错 } ``` 这里的`Logic.dbConnectString`是一个实例字段(非静态字段)。在初始化`connectionString`时,`Logic`实例可能还没有创建,所以编译器不允许。 解决方案: 1. 如果`dbConnectString`应该是静态的(即所有实例共享同一个值),那么将其改为静态字段。 2. 如果`dbConnectString`是实例字段,那么就不能在字段初始化式中使用。可以将初始化移到构造函数中。 例如,改为: ```csharp public class MyClass { private string connectionString; public MyClass(Logic logic) { connectionString = logic.dbConnectString; // 在构造函数中初始化 } } ``` 或者,如果`Logic`是同一个类中的实例,那么需要确保在初始化时已经存在`Logic`的实例。但注意,不能在同一个类的字段初始化式中引用另一个实例字段,因为它们初始化的顺序不确定。 另外,如果`Logic`是当前类的一个实例字段,那么这样写也是错误的,因为字段初始化式不能引用同一类的其他实例字段。这种情况下,也必须在构造函数中初始化。 例如: ```csharp public class MyClass { private Logic logic = new Logic(); private string connectionString; // 不能在这里用logic.dbConnectString public MyClass() { connectionString = logic.dbConnectString; } } ``` ### 错误2: 无法将类型“System.Threading.Tasks.Task<System.DateTime>”隐式转换为“System.DateTime” 这个错误出现在试图将异步方法返回的`Task<DateTime>`类型直接赋值给`DateTime`类型变量时。异步方法通常返回一个`Task`或`Task<T>`,表示异步操作。我们不能直接使用`Task<T>`的结果,而应该等待异步操作完成。 假设有代码: ```csharp DateTime result = GetDateTimeAsync(); // 错误,因为GetDateTimeAsync返回Task<DateTime> ``` 正确做法是使用`await`关键字: ```csharp DateTime result = await GetDateTimeAsync(); ``` 但注意,使用`await`的方法必须标记为`async`,并且返回类型通常是`Task`或`Task<T>`。 因此,包含上述代码的方法应该类似: ```csharp public async Task MyMethod() { DateTime result = await GetDateTimeAsync(); // 使用result } ``` 如果不能在异步方法中使用(例如在构造函数中),则需要考虑其他方式。注意,构造函数不能标记为`async`,所以不能在构造函数中直接使用`await`。这时可以调用异步方法并等待结果,但需要小心避免死锁。通常的做法是异步初始化模式。 例如: ```csharp public class MyClass { private DateTime _result; public MyClass() { // 不能在构造函数中等待,所以这样是不行的 // _result = await GetDateTimeAsync(); } // 使用异步初始化方法 public async Task InitializeAsync() { _result = await GetDateTimeAsync(); } } ``` 然后在创建对象后调用`InitializeAsync`方法。 另一种方法是使用一个异步工厂方法创建对象。 ### 错误3: “ExecuteNonQuery”方法没有采用3个参数的重载 这个错误通常发生在调用`SqlCommand`的`ExecuteNonQuery`方法时。`ExecuteNonQuery`方法有多个重载,但最常用的无参版本。如果我们传递了参数,可能是想执行带参数的命令,但参数应该通过`Parameters`属性添加,而不是直接传递给`ExecuteNonQuery`。 例如,错误代码可能如下: ```csharp command.ExecuteNonQuery(param1, param2, param3); ``` 正确的做法是: 1. 设置`CommandText`为SQL语句(可能包含参数占位符)。 2. 为命令对象添加参数并赋值。 3. 调用无参的`ExecuteNonQuery`方法。 示例: ```csharp using (var command = connection.CreateCommand()) { command.CommandText = "INSERT INTO Table (Col1, Col2, Col3) VALUES (@val1, @val2, @val3)"; command.Parameters.AddWithValue("@val1", value1); command.Parameters.AddWithValue("@val2", value2); command.Parameters.AddWithValue("@val3", value3); int rowsAffected = command.ExecuteNonQuery(); // 无参数 } ``` 如果错误是因为调用了一个自定义的`ExecuteNonQuery`方法,那么需要检查该方法的重载,确保传递了正确的参数个数和类型。 总结: 1. 错误1:将字段初始化移到构造函数中,或使用静态字段。 2. 错误2:使用`await`获取异步方法的结果,并确保调用方法是`async`方法;在构造函数中初始化异步结果需采用异步初始化模式。 3. 错误3:使用`Parameters`集合添加参数,然后调用无参的`ExecuteNonQuery`。 请根据你的实际代码进行相应调整。 §§相关问题§§ 1. 如何在C#中正确初始化依赖其他实例字段的字段? 2. 在构造函数中如何处理异步初始化? 3. 如何正确使用SqlCommand执行带参数的SQL语句? </think> ### 解决C#代码中的三个编译错误 #### 错误1: 字段初始值设定项无法引用非静态字段"Logic.dbConnectString" **问题分析** 当尝试在字段声明中直接引用实例成员时会出现此错误,因为字段初始值设定项执行时,当前实例尚未完全创建[^1]。 **解决方案** 将字段初始化移到构造函数中: ```csharp // 错误示例 private string _connString = Logic.dbConnectString; // 正确示例 private string _connString; public YourClass() { _connString = Logic.dbConnectString; // 在构造函数中初始化 } ``` #### 错误2: 无法将类型"Task<DateTime>"隐式转换为"DateTime" **问题分析** 异步方法返回的是`Task<DateTime>`而非直接返回`DateTime`,需要等待异步操作完成[^1]。 **解决方案** 使用`await`获取异步结果,并将包含方法标记为`async`: ```csharp // 错误示例 DateTime date = GetDateTimeAsync(); // 正确示例 public async Task ProcessData() { DateTime date = await GetDateTimeAsync(); // 使用await获取结果 // 后续操作... } ``` #### 错误3: "ExecuteNonQuery"方法没有采用3个参数的重载 **问题分析** `SqlCommand.ExecuteNonQuery()`不接受直接参数传递,参数应通过`Parameters`集合添加[^1]。 **解决方案** 使用参数化查询代替直接传参: ```csharp // 错误示例 cmd.ExecuteNonQuery(param1, param2, param3); // 正确示例 using (SqlCommand cmd = new SqlCommand( "INSERT INTO Table (Col1,Col2,Col3) VALUES (@p1,@p2,@p3)", conn)) { cmd.Parameters.AddWithValue("@p1", value1); cmd.Parameters.AddWithValue("@p2", value2); cmd.Parameters.AddWithValue("@p3", value3); cmd.ExecuteNonQuery(); // 无参调用 } ``` ### 关键点总结 1. 字段初始化顺序:静态字段 > 实例字段 > 构造函数 2. 异步操作必须通过`await`获取结果 3. ADO.NET参数必须通过`Parameters`集合传递 4. 组件封装性:通过访问器操作字段而非直接访问[^1]
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值