#asp.net #sql #vb.net
#asp.net #sql #vb.net
Вопрос:
Я попытаюсь пояснить, используя следующий пример. Здесь у меня есть два выпадающих списка (ddlInsertEmployee ddlInsertCustomer), которые оба должны быть привязаны для извлечения данных из таблиц [Employee.EmployeeID] и [Customer.CustomerID] и вставьте его в таблицу [Задача].
Проблема в том, что он вставляет данные от Employee.Полное имя и клиент.Полное имя в соотв. Сотрудник.Идентификатор сотрудника и клиент.Идентификатор пользователя. Если бы я изменил выпадающие списки на текстовые поля и вручную вставил идентификаторы, это сработало бы как шарм, но это не очень эффективно, я хочу иметь возможность видеть все полное имя.
Я не знаю, как изменить мою строку Sqlstring, чтобы это работало правильно. Я надеюсь, что это имеет какой-то смысл. Любая помощь очень ценится!
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.DropDownList
Protected Sub btnSubmit_Click(sender As Object, e As System.EventArgs) Handles btnSubmit.Click
Dim MyConn As OleDbConnection
Dim cmd As OleDbCommand
Dim Sqlstring, TaskDesc, TaskSolved, Employee, Customer, DateIn, DateOut, TaskHours As String
TaskDesc = txtTaskDesc.Text
TaskSolved = txtTaskSolved.Text
Employee = ddlInsertEmployee.Text
Customer = ddlInsertCustomer.Text
DateIn = txtDateReg.Text
DateOut = txtDateSolved.Text
TaskHours = txtHours.Text
MyConn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|DATABASE.accdb;")
MyConn.Open()
Sqlstring = "INSERT INTO Task (TaskDesc, TaskSolved, EmployeeID, CustomerID, DateIn, DateOut, TaskHours) VALUES ('" TaskDesc "', '" TaskSolved "', '" Employee "', '" Customer "', '" DateIn "', '" DateOut "', '" TaskHours "')"
cmd = New OleDbCommand(Sqlstring, MyConn)
cmd.ExecuteNonQuery()
MyConn.Close()
lblMessage.Text = "Task Added Successfully !!!"
End Sub
End Class
--------
amp;nbsp;Employee
<asp:DropDownList ID="ddlInsertEmployee" runat="server" AutoPostBack="True"
DataSourceID="SqlDataSource5" DataTextField="EmployeeFullName"
DataValueField="EmployeeFullName">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource5" runat="server"
ConnectionString="<%$ ConnectionStrings:conntoDB %>"
ProviderName="<%$ ConnectionStrings:conntoDB.ProviderName %>"
SelectCommand="SELECT EmployeeFullName, EmployeeID FROM Employee">
</asp:SqlDataSource>
amp;nbsp;amp;nbsp;amp;nbsp;
<br />
<br />
Customeramp;nbsp;<asp:DropDownList ID="ddlInsertCustomer" runat="server"
AutoPostBack="True" DataSourceID="SqlDataSource6"
DataTextField="CustomerFullName" DataValueField="CustomerFullName">
</asp:DropDownList>
<asp:SqlDataSource ID="SqlDataSource6" runat="server"
ConnectionString="<%$ ConnectionStrings:conntoDB %>"
ProviderName="<%$ ConnectionStrings:conntoDB.ProviderName %>"
SelectCommand="SELECT CustomerID, CustomerFullName FROM Customer">
</asp:SqlDataSource>
Я получаю сообщение об ошибке:
Exception Details: System.Data.OleDb.OleDbException: Data type mismatch in criteria expression.
Source Error:
Line 60: Sqlstring = "INSERT INTO Task (TaskDesc, TaskSolved, EmployeeID, CustomerID, DateIn, DateOut, TaskHours) VALUES ('" TaskDesc "', '" TaskSolved "', '" Employee "', '" Customer "', '" DateIn "', '" DateOut "', '" TaskHours "')"
Line 61: cmd = New OleDbCommand(Sqlstring, MyConn)
[B]Line 62: cmd.ExecuteNonQuery() Line 63: MyConn.Close()[/B]
Line 64: lblMessage.Text = "Task Added Successfully !!!"
Source File: C:ProjektNewTask.aspx.vb Line: 62
Комментарии:
1. Обязательный комментарий о SQL-инъекции ; вы не должны объединять строки для создания подобных SQL-запросов. Используйте параметризованные запросы.
Ответ №1:
Попробуйте установить значение DataValueField
вашего ddlInsertCustomer
to CustomerID
(и аналогичное для выпадающего списка вашего сотрудника). Затем вы можете использовать ddl.SelectedValue
свойство для сохранения в базе данных, но пользователь все равно будет видеть свойство name .
Также вставлять текст в текстовое поле в ваши SQL-запросы — действительно плохая идея, поскольку это открывает вам доступ к SQL-инъекции. Использование параметров SQL — действительно хорошая идея.
Комментарии:
1. Хах, это сработало. Блестяще! Спасибо миллион. Я сижу с этим часами!