从SQL数据库填充下拉列表时出错

时间:2015-07-22 15:37:03

标签: c# sql-server database visual-studio-2012 web-config

所以我已经成功地将数据连接添加到我的VS项目中,现在我尝试使用来自数据库的表中的数据填充我创建的下拉菜单;但是,当我运行代码时,"登录失败,使用'用户名',在这一行:

                    cmd.Connection.Open();

这是我的C#代码:

 using System.Web;
 using System.Web.Security;
 using System.Web.UI;
 using System.Web.UI.WebControls;
 using System.Web.UI.WebControls.WebParts;
 using System.Web.UI.HtmlControls;
 using System.Data.SqlClient;

    namespace Test1234
    {
        public partial class Home : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                PopulateDDList1();
                //PopulateDDList2();
                //PopulateDDList2_1();
            }




            public void PopulateDDList1()
            {
                SqlCommand cmd = new SqlCommand("SELECT * FROM [History]", new SqlConnection(ConfigurationManager.AppSettings["Connection"]));
                cmd.Connection.Open();

                SqlDataReader ddlValues;
            ddlValues = cmd.ExecuteReader();

            DropDownList1.DataSource = ddlValues;
            DropDownList1.DataValueField = "Serial";
            DropDownList1.DataTextField = "Serial";
            DropDownList1.DataBind();

            cmd.Connection.Close();
            cmd.Connection.Dispose();

        }//end Populate 1
     }
}

这是web.config代码:

<?xml version="1.0"?>

<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>

    <connectionStrings>
        <add name="ActioNetITInventoryConnectionString" connectionString="Data Source=10.10.101.188;Initial Catalog=ActioNetITInventory;User ID=rails.sa;Password=ActioNet1234"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
    </system.web>

  <appSettings>
    <add key="Connection" value="Data Source=10.10.101.188;Initial Catalog=ActioNetITInventory;User ID=rails.sa;Password=***********;Integrated Security=True"/>
  </appSettings>

</configuration>

4 个答案:

答案 0 :(得分:0)

我认为由于您的连接字符串而出现错误。您是否有理由不使用服务器名称而是使用其IP? 顺便说一下:你在两个不同的配置部分中定义了两次..

如果您正在使用IP,则必须添加端口:

Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;
Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;

或者你可以使用标准方式:

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;

如果可能的话甚至更好:使用可信连接:

Server=myServerAddress;Database=myDataBase;

一般来看看:http://www.connectionstrings.com/sql-server/

答案 1 :(得分:0)

<appSettings>
    <add key="Connection" value="Data Source=10.10.101.188;Initial Catalog=ActioNetITInventory;User ID=rails.sa;Password=***********;Integrated Security=True"/>
  </appSettings>

您的连接字符串包含登录名和密码以及Integrated Security=True

如果您尝试使用指定的登录名/密码登录,请设置Integrated Security=False或完全不使用

答案 2 :(得分:0)

您有几个潜在的失败点,例如:

  • 致电ExecuteReader但未实际验证数据,即无Null
  • 当您只需要KeyValue时,可能会返回多个列。
  • 您确定Serial是否有效。
  • 您的连接包括集成安全性和登录/密码。使用其中一个。 (Kritner的答案有很好的信息和方向)。

为了使您的代码更清晰,更健壮,您可以执行以下操作:

public IList<TModel> GetModel<T>(string query) where TModel : new()
{
     var container = new List<T>();
     using(var connection = new SqlConnection(dbConnection))
          using(var command = new SqlCommand(query, connection))
          {
               connection.Open();
               using(var reader = command.ExecuteReader())
                  while(reader.Read())
                  {
                       TModel model = new TModel();
                       var type = model.GetType();
                       var table = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToArray();

                       foreach(var property in type.GetProperties())
                            foreach(var column in table)
                                 if(String.Compare(property.Name, column, true) == 0)
                                     if(!reader.IsDBNull(reader.GetOrdinal(property.Name)))
                                      property.SetValue(model, reader.GetValue(reader.GetOrdinal(property.Name)), null);

                       container.Add(model);
                  }
          }
}

以下方法将构建您的模型,因此您只需执行以下操作:

drpExample.DataSource = GetModel<Person>("SELECT * FROM [History]");
drpExample.DataBind();

你真的不应该有这样的直接查询,你应该真的使用参数,但这应该让你开始。此外,您还需要我经常应用于前端的DataKeyValueDataKeyText。您只需将值设置为模型中的相关Property即可。

答案 3 :(得分:0)

正如我的评论中所述,您无法同时提供login credentials和州integrated security=true - 其中一个或另一个。

Integrated Security基本上说&#34;使用我登录系统的当前域凭据。&#34;

话虽如此,你可能希望它看起来像这样:

<add key="Connection" 
    value="Data Source=10.10.101.188;Initial Catalog=ActioNetITInventory;User ID=rails.sa;Password=ActioNet1234;"/>

虽然&#34;连接&#34;看起来多余,因为您已经有一个具有相同信息的连接字符串。你可以这样使用:

SqlCommand cmd = new SqlCommand(
    "SELECT * FROM [History]", 
    new SqlConnection(
        ConfigurationManager.ConnectionStrings["ActioNetITInventoryConnectionString"].ConnectionString)
    )
);