C# 按名字和姓氏搜索数据库
我正在使用ASP.NET与C#和亚音速。 我正试图通过名字和姓氏在文本字段上设置搜索C# 按名字和姓氏搜索数据库,c#,asp.net,subsonic,C#,Asp.net,Subsonic,我正在使用ASP.NET与C#和亚音速。 我正试图通过名字和姓氏在文本字段上设置搜索 First or Last Name: <asp:TextBox ID="txtSearchName" runat="server"></asp:TextBox> <asp:linkButton runat="server" Text="Send" onclick="btnSubmit_Click" /> <asp:GridView bord
First or Last Name: <asp:TextBox ID="txtSearchName" runat="server"></asp:TextBox>
<asp:linkButton runat="server" Text="Send" onclick="btnSubmit_Click" />
<asp:GridView
border="0"
cellpadding="3"
cellspacing="3"
ShowHeader="True"
allowsorting="true"
ID="GridView1"
runat="server"
AutoGenerateColumns="false"
Visible="false"
AllowPaging="True"
PageSize="10"
PagerStyle-Mode="NumericPages"
OnPageIndexChanging="GridView1_PageIndexChanging"
>
如果您输入名字或姓氏,这是可行的,但我希望能够从一个文本字段中同时搜索这两个名称。这可能吗 拆分this.txtSearchName.Text的内容,如果它包含一个单词,请使用原始查询;如果它包含两个单词,请使用修改后的查询版本:
private void BuildGridView1()
{
string[] names = String.Split(this.txtSearchName.Text, ' ');
if (names.length == 1) {
GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
.From(PastAwardName.Schema)
.InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
.Where(PastAwardName.Columns.LName).IsEqualTo(names[0])
.Or(PastAwardName.Columns.FName).IsEqualTo(names[0])
.OrderAsc(PastAwardType.Columns.AwardYear)
.ExecuteDataSet();
}
else if (names.Length == 2) {
GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
.From(PastAwardName.Schema)
.InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
.Where(PastAwardName.Columns.LName).IsEqualTo(names[1])
.And(PastAwardName.Columns.FName).IsEqualTo(names[0])
.OrderAsc(PastAwardType.Columns.AwardYear)
.ExecuteDataSet();
}
}
当用户未在文本框中输入值或输入3个或更多单词时,您可能还需要添加错误处理/验证。拆分此.txtSearchName.text的内容,如果它包含一个单词,请使用原始查询;如果它包含两个单词,请使用修改后的查询版本:
private void BuildGridView1()
{
string[] names = String.Split(this.txtSearchName.Text, ' ');
if (names.length == 1) {
GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
.From(PastAwardName.Schema)
.InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
.Where(PastAwardName.Columns.LName).IsEqualTo(names[0])
.Or(PastAwardName.Columns.FName).IsEqualTo(names[0])
.OrderAsc(PastAwardType.Columns.AwardYear)
.ExecuteDataSet();
}
else if (names.Length == 2) {
GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
.From(PastAwardName.Schema)
.InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
.Where(PastAwardName.Columns.LName).IsEqualTo(names[1])
.And(PastAwardName.Columns.FName).IsEqualTo(names[0])
.OrderAsc(PastAwardType.Columns.AwardYear)
.ExecuteDataSet();
}
}
当用户没有在文本框中输入值或输入3个或更多单词时,您可能还需要添加错误处理/验证。您应该能够生成查询,然后根据您是否有多个名称附加或/和限制。下面的方法应该有效,但您应该注意,边缘情况(如双裸名、用户输入中间名等)会让您感到困惑:
private void BuildGridView1()
{
string[] names = this.txtSearchName.Text.Split(" ".ToCharArray());
SqlQuery query = DB.Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
.From(PastAwardName.Schema)
.InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
.Where(PastAwardName.Columns.FName).IsEqualTo(names[0])
if(names.Length > 1)
query = query.And(PastAwardName.Columns.LName).IsEqualTo(names[1])
else
query = query.Or(PastAwardName.Columns.LName).IsEqualTo(names[0]
GridView1.DataSource = query.OrderAsc(PastAwardType.Columns.AwardYear)
.ExecuteDataSet();
}
您应该能够构建查询,然后根据是否有多个名称附加或/和限制。下面的方法应该有效,但您应该注意,边缘情况(如双裸名、用户输入中间名等)会让您感到困惑:
private void BuildGridView1()
{
string[] names = this.txtSearchName.Text.Split(" ".ToCharArray());
SqlQuery query = DB.Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*")
.From(PastAwardName.Schema)
.InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID)
.Where(PastAwardName.Columns.FName).IsEqualTo(names[0])
if(names.Length > 1)
query = query.And(PastAwardName.Columns.LName).IsEqualTo(names[1])
else
query = query.Or(PastAwardName.Columns.LName).IsEqualTo(names[0]
GridView1.DataSource = query.OrderAsc(PastAwardType.Columns.AwardYear)
.ExecuteDataSet();
}
谢谢你的回答!这是有道理的,但我得到了以下错误:编译器错误消息:CS0650:坏数组声明器:要声明托管数组,秩说明符位于变量标识符之前。要声明固定大小的缓冲区字段,请在字段类型之前使用fixed关键字。源错误:第55行:{第56行:第57行:字符串名称[]=string.Split(this.txtSearchName.Text,“”);啊,是的,Split方法使用中的错误。现在已修复。我更改了下面的行,但仍然得到相同的错误…字符串名称[]=this.txtSearchName.Text.Split(““.ToCharArray()”);对不起,我是个白痴,拆分行应该是:string[]names=this.txtSearchName.Text.split(“.ToCharArray()”);刚刚注意到问题;)…它现在运行得很好!再次感谢!感谢您的回答!这是有意义的,但我收到了以下错误:编译器错误消息:CS0650:错误数组声明器:要声明托管数组,秩说明符位于变量标识符之前。要声明固定大小的缓冲区字段,请使用fixed关键字在字段类型之前。源错误:第55行:{第56行:第57行:字符串名称[]=string.Split(this.txtSearchName.Text,“”);啊,是的,Split方法使用中的错误。现在已修复。我更改了下面的行,但仍然得到相同的错误…字符串名称[]=this.txtSearchName.Text.Split(“.ToCharArray());对不起,我是个白痴,拆分行应该是:string[]names=this.txtSearchName.Text.split(“.ToCharArray()”);刚刚注意到问题;)…现在工作得很好!再次感谢!