【问题标题】:Reading sql one row at a time c#一次读取 sql 一行 c#
【发布时间】:2018-06-26 13:37:38
【问题描述】:
public void addintovisitor()
{
string companyname = (txtvisitor.Text.ToUpper());
DataSet result = new DataSet();
visitorcompany vc = new visitorcompany();
string Location1 = Convert.ToString(Session["location"]);
vc.checksamecompanyname(ref result, Location1);
for (int i = 0; i < result.Tables["details"].Rows.Count; i++)
{
if (companyname == result.Tables["details"].Rows[i]["Companyname"].ToString())
{

}
else
{
 string strConn = Convert.ToString(ConfigurationManager.ConnectionStrings["connectionstring"]);
 SqlConnection conn = new SqlConnection(strConn);
 SqlCommand cmd = new SqlCommand(
                  "INSERT INTO tblVisitorcompany ([CompanyName], " +
                  "[Location1]) " +
                  "VALUES(@CompanyName, @Location1)", conn);

                cmd.Parameters.AddWithValue("@Companyname", companyname);
                cmd.Parameters.AddWithValue("@Location1", Location1);
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
 }
 }
 }

我的访客公司类:

public int checksamecompanyname(ref DataSet result, string Location1)
{        
  string strConn = Convert.ToString(
  ConfigurationManager.ConnectionStrings
  ["connectionstring"]);
  SqlConnection conn = new SqlConnection(strConn);
  SqlCommand cmd = new SqlCommand
  ("select Companyname from tblVisitorcompany where Location1 ='" + Location1 + "'", conn);
  SqlDataAdapter da = new SqlDataAdapter(cmd);
  conn.Open();
  da.Fill(result, "details");
  conn.Close();
  //Return 0 when no error occurs.
  return 0;
  }

我正在尝试一次搜索一行以检查 sql 表是否具有相同的公司名称。如果已经存在公司名称,则程序将不执行任何操作。如果这是一个新的公司名,程序会将公司名添加到 sql 表中。但是,当添加新的公司名称时,程序会添加不止一次。有人可以帮我重新编辑我的程序,使它只添加一个新的公司名称。非常感谢。

【问题讨论】:

  • 如果要读取数据,应使用SELECT 语句并执行ExecuteReader 而不是ExecuteNonQuery。要解决重复的真正问题,您应该在companyname 列上创建一个unique key,然后您可以在C# 中处理异常。
  • a) 您应该让您的数据库阻止您在不需要的行中插入两次,您可以使用自动生成的 id 作为主键并对公司名称进行唯一约束 b) 您需要决定是否要插入一次,如果重复则跳过,或者更新其他字段。如果要更新,请参阅合并:docs.microsoft.com/en-us/sql/t-sql/statements/… 否则请参阅“如果不存在 ...”stackoverflow.com/questions/1175217/…
  • 关于上面的cmets,暗示了更好的数据库设计,这样搜索数据库效率不高,最好让数据库为您完成工作。即 "SELECT COUNT(*) FROM tblVistorCompany WHERE Companyname like '" + name + "'";

标签: c# sql


【解决方案1】:

不要使用companyname 作为插入命令的参数,因为它在 for 循环中保持不变。请改用result.Tables["details"].Rows[i]["Companyname"].ToString()

...
cmd.Parameters.AddWithValue("@Companyname", result.Tables["details"].Rows[i]["Companyname"].ToString());
...

【讨论】:

    【解决方案2】:
    using( var connection = new SqlConnection( "my connection string" ) ) {
    using( var command = connection.CreateCommand() ) {
        command.CommandText = "SELECT Column1, Column2, Column3 FROM myTable";
    
        connection.Open();
        using( var reader = command.ExecuteReader() ) {
            var indexOfColumn1 = reader.GetOrdinal( "Column1" );
            var indexOfColumn2 = reader.GetOrdinal( "Column2" );
            var indexOfColumn3 = reader.GetOrdinal( "Column3" );
    
            while( reader.Read() ) {
                var value1 = reader.GetValue( indexOfColumn1 );
                var value2 = reader.GetValue( indexOfColumn2 );
                var value3 = reader.GetValue( indexOfColumn3 );
    
                // now, do something what you want
            }
        }
        connection.Close();
    }
    

    【讨论】:

      【解决方案3】:

      检查该值是否存在,如果不存在,然后添加它。
      代码中的一个简单更改:

      bool valueFound = false;
      
      // check if the value exists
      for (int i = 0; i < result.Tables["details"].Rows.Count; i++)
      {
          if (companyname == result.Tables["details"].Rows[i]["Companyname"].ToString())
          {
              // it exists so we exit the loop
              valueFound = true;
              break;
          }
      }
      
      // we have looped all the way without finding the value, so we can insert
      if(!valueFound)
      {
          string strConn = Convert.ToString(ConfigurationManager.ConnectionStrings["connectionstring"]);
          SqlConnection conn = new SqlConnection(strConn);
          SqlCommand cmd = new SqlCommand(
                "INSERT INTO tblVisitorcompany ([CompanyName], " +
                "[Location1]) " +
                "VALUES(@CompanyName, @Location1)", conn);
      
           cmd.Parameters.AddWithValue("@Companyname", companyname);
           cmd.Parameters.AddWithValue("@Location1", Location1);
           conn.Open();
           cmd.ExecuteNonQuery();
           conn.Close();
      }
      

      当然,您可以以更有效的方式检查该值是否存在,但这至少应该解决您的具体问题。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 2012-10-16
        • 2021-12-05
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多