Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中从SQL Server中的多个表中进行选择_C#_Sql Server - Fatal编程技术网

C# 在C中从SQL Server中的多个表中进行选择

C# 在C中从SQL Server中的多个表中进行选择,c#,sql-server,C#,Sql Server,System.Data.SqlClient.SqlException:'列名称不明确 “学校ID” 我需要从两个数据库表School Info和School_academyear中的两个组合框中选择SchoolName==SchoolID和academyear 另外,School_AcademicYear中的SchoolID是外键,它的主键是School_Info,我正在使用内部联接来联接这两个表,但出现了一个错误 列名称“SchoolID”不明确 这些表中有多个名为SchoolID的列 您必须

System.Data.SqlClient.SqlException:'列名称不明确 “学校ID”

我需要从两个数据库表School Info和School_academyear中的两个组合框中选择SchoolName==SchoolID和academyear

另外,School_AcademicYear中的SchoolID是外键,它的主键是School_Info,我正在使用内部联接来联接这两个表,但出现了一个错误

列名称“SchoolID”不明确


这些表中有多个名为SchoolID的列

您必须指定列名,因为sql无法知道需要哪个列名。示例:School_Info.SchoolID


如果联接两个包含同名列的表,并在选择列表中引用其中一列,则需要指定从哪个表获取值。为了解决这个问题,让我们开始使用一些作为表名。使用列名称前面的别名可以正确标识源表中的列。 同时,我还将字符串连接更改为参数化查询。它更好,因为它避免了解析错误和一个众所周知的安全问题,即


为了完成此回答,还介绍了一次性连接对象周围的。这样,当代码退出using块时,连接被关闭并释放。注意,我假设AcademicYearID是一个数字,而不是一个字符串,参数的类型为SqlDbType.Int,而不是NVarChar。

当连接的两个表中有同名的列,并且您在选择列表中引用了其中一列时,则需要指定从哪个表中获取值将数据转换为字符串以使查询仍然是错误的、容易出错的、无效的,构成SQL查询的危险且严重过时的方法。始终使用参数。总是另请参见@Steve i有一个同名的列,即SchoolID,并选择第一个SchoolID(主键)位于School_信息表中,第二个SchoolID(外键)位于School_学年表中。。请你给我写一段大家都说的代码,用参数代替字符串连接。这样做的一个优点是,在声明和初始化参数后,您可以在SQLServerManagementStudio中使查询工作,查询工作后,只需将其复制/粘贴到代码中即可。您可能还想看看Dapper,它简化了很多工作,而且执行成本非常低
con.Open();
adp = new SqlDataAdapter("SELECT AcademicYearID,AcademicYear,SchoolID FROM School_AcademicYear  INNER JOIN School_Info ON School_AcademicYear.AcademicYearID = School_Info.SchoolID  where School_AcademicYear.AcademicYearID = '" + AcademicYearID + "'", con);
dt = new DataTable();
adp.Fill(dt);
dataGridViewSchoolNMergeAcYear.DataSource = dt;
con.Close();
adp = new SqlDataAdapter(`
SELECT AcademicYearID,AcademicYear,School_Info.SchoolID 
FROM School_AcademicYear  
INNER JOIN School_Info ON School_AcademicYear.AcademicYearID = School_Info.SchoolID  
where School_AcademicYear.AcademicYearID = '` + AcademicYearID + "'", con);
using(SqlConnection con = new SqlConnection(.......))
{
    string cmdText = @"SELECT a.AcademicYearID,a.AcademicYear,i.SchoolID 
                       FROM School_AcademicYear a INNER JOIN School_Info i 
                         ON a.AcademicYearID = i.SchoolID  
                      WHERE a.AcademicYearID = @id";
    con.Open();
    adp = new SqlDataAdapter(cmdText, con);
    adp.SelectCommand.Parameters.Add("@id", SqlDbType.Int).Value = AcademicYearID;
    dt = new DataTable();
    adp.Fill(dt);
    dataGridViewSchoolNMergeAcYear.DataSource = dt;
}