我找不到数据库的列

时间:2014-03-10 21:54:42

标签: c# sql sql-server-express

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;

namespace CSharpApp.Classes
{

  public class RegistrationClass
  {
    SqlConnection myConnection = new SqlConnection("Data Source=MOE-   PC\\SQLEXPRESS;   InitialCatalog=db_University;Integrated Security=True;Pooling=False");
    ConnectionClass con = new ConnectionClass();

    String fullName, motherName, gender, placeOfBirth, email, phone, adress,  schoolDegree, languages, highSchool, faculty, major;



    public void setValues (String fullName1,String motherName1,String gender1,String placeOfBirth1,String email1,String phone1,String adress1, String faculty1,String major1,String schoolDegree1,String languages1,String highSchool1)
    {

        fullName = fullName1;
        motherName = motherName1;
        gender = gender1;
        placeOfBirth= placeOfBirth1;
        email =email1;
        phone= phone1;
        adress =adress1;
        faculty =faculty1;
        major =major1;
        schoolDegree =schoolDegree1;
        languages =languages1;
        highSchool = highSchool1;
    }

    public void  InsertStudentInfo()
    {
        String query = "Insert into StudentInfo( fullName, motherName, gender, placeOfBirth, email, phone, adress,schoolDegree, languages, highSchool) values( fullName, motherName, gender, placeOfBirth, email, phone, adress,schoolDegree, languages, highSchool) ";
        SqlCommand myCommand = new SqlCommand(query, myConnection);
        myConnection.Open();
        myCommand.ExecuteNonQuery();
        myConnection.Close();

    }

    public void  InsertUniversityInfo()
    {

        String query = "Insert into universityInfo( faculty,major) Values (faculty, major)";
        SqlCommand myCommand = new SqlCommand(query, myConnection);
        con.openConnection();
        myCommand.ExecuteNonQuery();
        con.closeConnection();
    }
}

我找不到数据库表的列。我不知道为什么

  

无效的列名'motherName'   列名称“性别”无效。
  列名称'placeOfBirth'无效。
  .....

2 个答案:

答案 0 :(得分:1)

INSERT命令有两种形式:

(1)您可以使用所有值,文字或SQL Server 变量 - 在这种情况下,您可以使用INSERT .. VALUES()方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)

注意:我建议始终明确指定要插入数据的列列表 - 这样,如果您的表突然有一个额外的列,或者如果突然您的表有额外的列,您将不会有任何令人讨厌的意外您的表具有IDENTITY或计算列。是的 - 这是一个更多的工作 - 一次 - 但是你的INSERT陈述尽可能坚实,如果你的桌子你不必经常摆弄它变化。

(2)如果您将所有值都作为文字和/或变量,而是您想要依赖另一个表,多个表或视图,提供值,然后您可以使用INSERT ... SELECT ...方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView

在这里,您必须在SELECT中定义与INSERT所期望的完全相同的项目 - 这些项目可以是表格(或视图)中的列,或者那些可以是文字或变量。再次:明确提供要插入的列的列表 - 参见上文。

您可以使用其中一个 - 但无法混合两者 - 您无法使用VALUES(...)然后进行SELECT查询在你的价值列表中间 - 选择其中一个 - 坚持下去。

因此,您需要使用VALUES(...)方法并拥有文字或SQL Server变量(以@开头) - 或者您需要使用INSERT ... SELECT ...方法来引用到数据库表中的其他列。选择一个 - 现在,您的INSERT语句实际上既不是这两个有效选项

答案 1 :(得分:0)

您的INSERT查询似乎在两个方面被打破了......

首先,正如错误所示,那些列显然不存在于该表中。检查StudentInfo表的架构。无论你多么确定它是正确的,SQL查询引擎通常通常关于这些事情。

其次,你实际插入了什么?看看你的问题:

Insert into StudentInfo (fullName, motherName, gender, placeOfBirth, email, phone, adress,schoolDegree, languages, highSchool)
                 values (fullName, motherName, gender, placeOfBirth, email, phone, adress,schoolDegree, languages, highSchool)

您是否尝试插入已存在于表中的值?您实际尝试插入哪些数据?您只需引用VALUES子句中INTO子句中的相同列。即使这样可行,但我保证它不会做你期望它做的事情,不管是什么。您需要提供才能插入数据库。没有要插入的值,您要做什么?

如果您尝试插入此对象中的值,则需要将这些值添加为参数。首先,调整查询:

Insert into StudentInfo (fullName, motherName, gender, placeOfBirth, email, phone, address, schoolDegree, languages, highSchool)
                 values (@fullName, @motherName, @gender, @placeOfBirth, @email, @phone, @adress, @schoolDegree, @languages, @highSchool)

请注意添加@个字符以指示该单词是参数的占位符。然后,您需要将参数添加到命令:

SqlCommand myCommand = new SqlCommand(query, myConnection);
myCommand.Parameters.AddWithValue("@fullName", fullName);
myCommand.Parameters.AddWithValue("@motherName", motherName);
// and so on for the rest of the parameters...

最后,作为旁注,您不应该跨多个这样的操作共享连接对象。这是邀请资源泄漏和其他错误。相反,创建(并随后销毁)靠近其使用位置的连接对象,使其保持活动的时间尽可能短:

using (SqlConnection myConnection = new SqlConnection("Data Source=MOE-   PC\\SQLEXPRESS;   InitialCatalog=db_University;Integrated Security=True;Pooling=False"))
{
    String query = "Insert into StudentInfo (fullName, motherName, gender, placeOfBirth, email, phone, address, schoolDegree, languages, highSchool) values (@fullName, @motherName, @gender, @placeOfBirth, @email, @phone, @adress, @schoolDegree, @languages, @highSchool)";
    SqlCommand myCommand = new SqlCommand(query, myConnection);
    myCommand.Parameters.AddWithValue("@fullName", fullName);
    myCommand.Parameters.AddWithValue("@motherName", motherName);
    // and so on for the rest of the parameters...
    myConnection.Open();
    try
    {
        myCommand.ExecuteNonQuery();
    }
    finally
    {
        myConnection.Close();
    }
}