字符串处理结果和预想的不一样

哈特比尔波 2018-05-27 07:43:22
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.Odbc;
using System.Data.SqlClient;
using System.Management;
namespace notebook
{
public partial class Form2 : Form
{
public string dongzuo = "查询记录";
string dongzuocode = "";


public Form2()
{
InitializeComponent();
comboBox1.SelectedIndex = 0;

}

private void 導入ToolStripMenuItem_Click(object sender, EventArgs e)
{

}
#region 重置按钮事件
private void button2_Click(object sender, EventArgs e)
{
dongzuo = comboBox1.SelectedText;
zichanbianhaotB.ResetText();
guanzhibianmatB.ResetText();
shebeixinghaotB.ResetText();
loudongloucengtB.ResetText();
jifangtB.ResetText();
jifangtB.ResetText();
MACtB.ResetText();
iptB.ResetText();
sntB.ResetText();
beizhutB.ResetText();
baoguanrentB.ResetText();
shiyequntB.ResetText();
shujuxierutimetB.ResetText();
zuihouxiugaitimetB.ResetText();
comboBox1.SelectedText = "查询数据";
}
#endregion
private void dataGridView1_CellMouseDoubleClick(object sender, DataGridViewCellEventArgs e)
{
zichanbianhaotB.Text=dataGridView1.CurrentRow.Cells.ToString();

}

private void button1_Click(object sender, EventArgs e)
{
dongzuo = comboBox1.SelectedItem.ToString();
#region 数据库连接
string str = "Data Source=10.244.170.110;Database=NetAssetManagement; User ID=netadmin; Password=chinamisadmin; pooling=false ";
DataSet ds=new DataSet();
SqlConnection con = new SqlConnection(str);
SqlCommand cmd = new SqlCommand("", con);
cmd.CommandType=CommandType.Text;
SqlDataAdapter adpt = new SqlDataAdapter(cmd);
//SqlParameter [] para=new SqlParameter[15];
#endregion
string sysnumber = "";
string zichanbianhao = "";
string guanzhibianhao = "";
string xinghao = "";
string loudong = "";
string jifang = "";
string jigui = "";
string ipaddress = "";
string mac = "";
string sn = "";
string beizhu = "";
string baoguanren = "";
string shiyechu = "";
string shujuxierutime = "";
string zuihouxiugaitime = "";
sysnumber = sysnumbervalue.Text.Trim();
zichanbianhao = zichanbianhaotB.Text.Trim();
guanzhibianhao = guanzhibianmatB.Text.Trim();
xinghao = shebeixinghaotB.Text.Trim();
loudong = loudongloucengtB.Text.Trim();
jifang = jifangtB.Text.Trim();
jigui = jiguitB.Text.Trim();
mac = MACtB.Text.Trim();
ipaddress = iptB.Text.Trim();
sn = sntB.Text.Trim();
beizhu = beizhutB.Text.Trim();
shiyechu = shiyequntB.Text.Trim();
shujuxierutime = shujuxierutimetB.Text.Trim();
zuihouxiugaitime = zuihouxiugaitimetB.Text.Trim();

//定义两个数组来分别存储数据库表字段和对应从页面上获取到的值
string[] fieldName = { "资产编号", "管制编号", "型号", "楼栋", "机房", "机柜", "MAC地址", "IP地址", "SN", "事业处", "备注", "资产保管人" };
string[] fieldValue = { zichanbianhao, guanzhibianhao, xinghao, loudong, jifang, jigui, mac, ipaddress, sn, shiyechu, beizhu, baoguanren };

#region 判断执行代码
switch (dongzuo)
{
case "查询记录":
// 因数据库写入的数据含有繁体中文,所以查询的值中含有中文的需要在查询的值前加上大写的N
dongzuocode = "select 序号,资产编号,管制编号,型号,楼栋,机房,机柜,MAC地址,IP地址,SN,事业处,备注,资产保管人 from netadmin.newnetworkzichan where ";
for (int i = 0; i < fieldValue.Length; i++)
{
if (!string.IsNullOrEmpty(fieldValue[i]))
{
dongzuocode += (fieldName[i] + " like'%" + fieldValue[i] + "%' and ");
}
}
string abc = dongzuocode.Substring(0, dongzuocode.Length);
string bc = dongzuocode.Substring(0, dongzuocode.Length - 5);
dongzuocode = dongzuocode.Substring(0, dongzuocode.Length - 5)+ " order by 楼栋,机房,机柜";
//连接字符串中还有空格以使生成的SQL代码正确且可执行。
break;
case "新增记录"://新增资产时,可以插入空值。所以SQL插入代码生成的循环可以直接连接一起来。
//dongzuocode = "insert into netadmin.newnetworkzichan (资产编号,管制编号,型号,楼栋,机房,机柜,MAC地址,IP地址,SN,事业处,备注,资产保管人) VALUES ('" + zichanbianhao + "','" + guanzhibianhao + "','" + xinghao + "','" + loudong + "','" + jifang + "','" + jigui + "','" + mac + "','" + ipaddress + "','" + sn + "','" + shiyechu + "','" + beizhu + "','" + baoguanren + "');";
dongzuocode = "insert into networkzichan ";
for (int i = 0; i < fieldValue.Length; i++)
{
dongzuocode += (fieldName[i] + "='" + fieldValue[i] + "',");
}
break;
case "更新记录"://更新记录时候我们最好获取序列号来定位需要更新的记录,然后判断直接用循环组合所有的数据来更新数据,这样可以避免像更新某个栏位为空时不好操作。
dongzuocode = "update networkzichan set ";
//利用for循环动态生成更新语句。只更新有值的,没有值的就保持原来的值不变。
for (int i = 0; i < fieldValue.Length; i++)
{
if (!string.IsNullOrEmpty(fieldValue[i]))
{
dongzuocode += (fieldName[i] + "='" + fieldValue[i] + "',");
}
}
break;
case "删除记录"://从左侧列表中获取数据的ID值,通过指定ID值来删除记录,从而限制只能一条一条的删除数据,批量删除数据后面批处理的时候再开发。

dongzuocode = "drop * from netadmin.newnetworkzichan where 序号="+sysnumber;
break;
case "导出记录":
//当单击导出按钮时,先盘点datagride
dongzuocode = "";
break;
}
#endregion
cmd.CommandText = dongzuocode;
try
{
con = new SqlConnection(str);
con.Open();
adpt.Fill(ds);
}
catch (Exception ex)
{
string err = ex.Message;
}
finally
{
con.Close();
}

DataTable dt=new DataTable();
if (ds != null)
{
dt = ds.Tables[0];

}
dataGridView1.DataSource = dt;
int a;
a=dataGridView1.RowCount;
chaxunjieguotiaoshu.Text = a.ToString()+"条数据";//统计查询结果中一共有多少条记录
benjiyonghulB.Text = "本机登录账户:" + System.Environment.UserName.ToUpper();//获取系统当前登录的用户名
#region 获取本机MAC地址
string strMac = string.Empty;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();

foreach (ManagementObject mo in moc)
{
if ((bool)mo["IPEnabled"] == true)
{
strMac += mo["MacAddress"].ToString() + " ";
}
}
#endregion
macxianshilB.Text = "本机MAC:"+strMac;//显示本机MAC地址
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
Application.Exit();//关闭并退出程序
}
}
}


以上代码当我在不输入 和输入任意一个字段值时候,都有结果,而且感觉还很顺畅。
但是我调试的时候发现,根据调试的值,不应该很顺畅和有结果啊。请各位网友帮忙解惑。

例如:档文本框中无任何值输入的时候:
以上代码中的:
string abc = dongzuocode.Substring(0, dongzuocode.Length);
string bc = dongzuocode.Substring(0, dongzuocode.Length - 5);
dongzuocode = dongzuocode.Substring(0, dongzuocode.Length - 5)+ " order by 楼栋,机房,机柜";

abc="select 序号,资产编号,管制编号,型号,楼栋,机房,机柜,MAC地址,IP地址,SN,事业处,备注,资产保管人 from netadmin.newnetworkzichan where "
bc="select 序号,资产编号,管制编号,型号,楼栋,机房,机柜,MAC地址,IP地址,SN,事业处,备注,资产保管人 from netadmin.newnetworkzichan w"
dongzuocode="select 序号,资产编号,管制编号,型号,楼栋,机房,机柜,MAC地址,IP地址,SN,事业处,备注,资产保管人 from netadmin.newnetworkzichan w order by 楼栋,机房,机柜"
这个时候原来的where关键字通过字符串处理被当做了netadmin.newnetworkzichan表的别名。结果显示正常。没有问题。
但是总给人不舒服的感觉。
为了去掉这个别名我把减掉的长度修改为6,此时我要是输入有值给文本框,我的代码就少了一个字符串结尾的符号“””,很有矛盾。
所以想问问各位亲爱的网友,您们在遇到这样的情况的时候如何处理。

另外想问下,这个拼接SQL代码还有其他的方法比我这个更便捷看起来更优美的么?请大家来帮我优化下代码。谢谢!
如果有规则建议最好了。谢谢各位网友。谢谢!
...全文
1338 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈特比尔波 2018-06-15
  • 打赏
  • 举报
回复
引用 1 楼 从事CSharp程序开发的回复:
这种情况一般都是使用SQL参数,也就是LZ屏蔽掉的SqlParameter
可以详细介绍下你说的那个方法的用法吗?或者推荐详细介绍的链接也可以,谢谢!
秋的红果实 2018-05-28
  • 打赏
  • 举报
回复
建议以后提问要将问题简化,只说有问题的地方
  • 打赏
  • 举报
回复
建议这样写:

case "查询记录":
    // 因数据库写入的数据含有繁体中文,所以查询的值中含有中文的需要在查询的值前加上大写的N
    dongzuocode = "select 序号,资产编号,管制编号,型号,楼栋,机房,机柜,MAC地址,IP地址,SN,事业处,备注,资产保管人 from netadmin.newnetworkzichan";

    //WHERE条件集合
    var whereStr = new List<string>();
    for (int i = 0; i < fieldValue.Length; i++)
    {
        if (!string.IsNullOrEmpty(fieldValue[i]))
        {
            whereStr.Add(fieldName[i] + " like'%" + fieldValue[i] + "%'");
        }
    }
    //string abc = dongzuocode.Substring(0, dongzuocode.Length);
    //string bc = dongzuocode.Substring(0, dongzuocode.Length - 5);
    //使用String的Join函数去拼接条件(空格建议在拼接时加,不要在原语句添加)
    dongzuocode = dongzuocode + " WHERE" + String.Join(" AND ",whereStr)  + " order by 楼栋,机房,机柜";
    //连接字符串中还有空格以使生成的SQL代码正确且可执行。
    break;
或者可以使用这种对你改动不大的写法:

//去除尾部空格,这样截取5个字节就行了
var dongzuocodeTemp = dongzuocode.TrimEnd();

string abc = dongzuocodeTemp.Substring(0, dongzuocodeTemp.Length);
string bc = dongzuocodeTemp.Substring(0, dongzuocodeTemp.Length - 5);
dongzuocode = dongzuocodeTemp.Substring(0, dongzuocodeTemp.Length - 5)+ " order by 楼栋,机房,机柜";
  • 打赏
  • 举报
回复
这种情况一般都是使用SQL参数,也就是LZ屏蔽掉的SqlParameter
sdutjsj1024 2018-05-28
  • 打赏
  • 举报
回复
推荐大家一个靠谱的论文检测平台。重复的部分有详细出处以及具体修改意见,能直接在文章上做修改,全部改完一键下载就搞定了。怕麻烦的话,还能用它自带的降重功能。哦对了,他们现在正在做毕业季活动, 赠送很多免费字数,可以说是十分划算了!地址是:http://www.paperpass.com/

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧