从SQL数据库填充下拉列表时出错
本文关键字:出错 下拉列表 填充 SQL 数据库 | 更新日期: 2023-09-27 18:04:08
所以我已经成功地将数据连接添加到我的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>
<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
或将其完全排除在之外
我认为由于您的连接字符串而出现错误。您不使用服务器名而是使用其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/
您有几个潜在的故障点,例如:
- 调用
ExecuteReader
但未实际验证数据,即没有Null
- 当您只需要一个
Key
和Value
时,可能会返回多个列 - 您确定
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();
你真的不应该有这样的直接查询,你真的应该使用Parameters,但这应该让你开始。此外,您还需要DataKeyValue
和DataKeyText
,我经常将它们应用于前端。您只需将该值设置为模型中相关的Property
即可。
正如我的评论中所说,您不能同时提供login credentials
和状态integrated security=true
——这是其中之一。
Integrated Security
基本上说"使用我登录系统时使用的当前域凭据。">
话虽如此,你可能希望它看起来像这样:
<add key="Connection"
value="Data Source=10.10.101.188;Initial Catalog=ActioNetITInventory;User ID=rails.sa;Password=ActioNet1234;"/>
尽管"连接"看起来是多余的,因为你已经有了一个具有相同信息的连接字符串。你可以这样使用:
SqlCommand cmd = new SqlCommand(
"SELECT * FROM [History]",
new SqlConnection(
ConfigurationManager.ConnectionStrings["ActioNetITInventoryConnectionString"].ConnectionString)
)
);