ASP.NET C#中DataTable单行数据转数组及SQL错误排查
问题分析与解决方案
嘿,我一眼就揪出了导致这个SQL异常的问题所在!
核心错误点
你写的SQL查询语句里有个低级语法错误:在SELECT的列列表中,你把[7],[8]误写成了[7].[8]。SQL会把[7].[8]解析成表名为7、列名为8的多部分标识符,但你的目标表是Seatlist,根本不存在名为7的表,所以直接抛出了System.Data.SqlClient.SqlException: 多部分标识符"7.8"无法绑定的错误。
另外还有个小细节:你添加了@Seatlist参数,但SQL语句里并没有用到它,这个多余的参数可以删掉,避免代码冗余。
修正后的完整代码
// 修正SQL语句中的[7].[8]为[7],[8],并移除未使用的@Seatlist参数 SqlCommand cmdp = new SqlCommand("SELECT [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31],[32],[33],[34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45],[46],[47],[48],[49],[50],[51],[52],[53],[54],[55],[56],[57],[58],[59],[60],[61],[62],[63],[64],[65],[66],[67],[68],[69],[70],[71],[72],[73],[74],[75],[76],[77],[78] from [Seatlist] where (([FlightNo] = @FN) AND ([Origin] = @Ori) AND ([Destination] = @Des) AND ([DepartureTimeDay] = @Dep) AND ( [DepartureTimeMonths] = @Dem) AND ( [DepartureTimeYears] = @Dey) AND ( [DepartureTime] = @Det))", con); // 移除未使用的@Seatlist参数 cmdp.Parameters.AddWithValue("@FN", FlightNo.Text); cmdp.Parameters.AddWithValue("@Ori", Origin.Text); cmdp.Parameters.AddWithValue("@Des", Destination.Text); cmdp.Parameters.AddWithValue("@Dep", DepartDay.Text); cmdp.Parameters.AddWithValue("@Dem", DepartMonth.Text); cmdp.Parameters.AddWithValue("@Dey", DepartureTimeYears.Text); cmdp.Parameters.AddWithValue("@Det", DepartureTime.Text); DataTable dtable = new DataTable(); dtable.Load(cmdp.ExecuteReader()); // 因为确定只有一行,直接取Rows[0]更简洁 DataRow row = dtable.Rows[0]; object[] array1 = row.ItemArray; int[] array2 = Array.ConvertAll(array1, p => Convert.ToInt32(p));
额外优化建议
既然你已经明确DataTable仅包含一行数据,完全没必要用dtable.AsEnumerable().Take(1).ToArray()绕一圈,直接通过dtable.Rows[0]获取行数据会更简洁直观。
内容的提问来源于stack exchange,提问作者Shi Jie Tio
相关产品推荐
相关产品推荐

