当前位置: 首页 > article >正文

WPF【10_2】数据库与WPF实战-示例

客户预约关联示例图

MainWindow.xaml 代码
<Window x:Class="WPF_CMS.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WPF_CMS"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Label Content="客户列表" HorizontalAlignment="Left" Margin="32,22,0,0" VerticalAlignment="Top"/>
    <ListBox Name="customerList" HorizontalAlignment="Left" Height="229" Margin="32,61,0,0" VerticalAlignment="Top" Width="249" SelectionChanged="customerList_SelectionChanged"/>
    <Label Content="预约记录" HorizontalAlignment="Left" Margin="444,22,0,0" VerticalAlignment="Top"/>
    <ListBox Name="appointmentList" HorizontalAlignment="Left" Height="229" Margin="444,61,0,0" VerticalAlignment="Top" Width="249"/>
    <Button Content="删除客户" HorizontalAlignment="Left" Margin="32,306,0,0" VerticalAlignment="Top" Width="249" Click="DeleteCustomer_Click"/>
    <Button Content="取消预约" HorizontalAlignment="Left" Margin="444,306,0,0" VerticalAlignment="Top" Width="249" Click="DeleteAppointment_Click"/>
    <TextBox Name="NameTextBox" HorizontalAlignment="Left" Margin="32,359,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <TextBox Name="IdTextBox" HorizontalAlignment="Left" Margin="322,359,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <TextBox Name="AddressTextBox" HorizontalAlignment="Left" Margin="175,359,0,0" Text="TextBox" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <Label Content="姓名" HorizontalAlignment="Left" Margin="32,331,0,0" VerticalAlignment="Top"/>
    <Label Content="身份证" HorizontalAlignment="Left" Margin="175,333,0,0" VerticalAlignment="Top"/>
    <Label Content="住址" HorizontalAlignment="Left" Margin="322,331,0,0" VerticalAlignment="Top"/>
    <Button Content="添加客户" HorizontalAlignment="Left" Margin="32,382,0,0" VerticalAlignment="Top" Click="AddCustomer_Click"/>
    <DatePicker Name="AppointmentDatePicker" HorizontalAlignment="Left" Margin="467,356,0,0" VerticalAlignment="Top"/>
    <Button Content="预约" HorizontalAlignment="Left" Margin="589,359,0,0" VerticalAlignment="Top" Click="AddAppointment_Click"/>
    <Button Content="更新客户资料" HorizontalAlignment="Left" Margin="112,387,0,0" VerticalAlignment="Top" Click="UpdateCustomer_Click"/>
</Grid>
</Window>

MainWindow.xaml.cs 代码
public partial class MainWindow : Window
{
    private SqlConnection _sqlConnection;
    public MainWindow()
    {
        InitializeComponent();
        string connectionString = "Data Source=localhost;Initial Catalog=course565;Persist Security Info=True;User ID=sa;Password=PaSSword12!;Pooling=False";

        _sqlConnection = new SqlConnection(connectionString);

        ShowCustomers();
    }

    private void ShowCustomers()
    {
        try
        {
            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("select * from Customers", _sqlConnection);

            using (sqlDataAdapter)
            {
                DataTable customerTable = new DataTable();
                sqlDataAdapter.Fill(customerTable);

                customerList.DisplayMemberPath = "Name";
                customerList.SelectedValuePath = "Id";
                customerList.ItemsSource = customerTable.DefaultView;
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }

    private void customerList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            string query = "select * from Appointments join Customers on Appointments.CustomerId = Customers.Id where Customers.Id = @CustomerId";

            var customerId = customerList.SelectedValue;
            if (customerId==null)
            {
                appointmentList.ItemsSource = null;
                return;
            }

            DataRowView selectedItem = customerList.SelectedItem as DataRowView;
            NameTextBox.Text = selectedItem["Name"] as string;
            IdTextBox.Text = selectedItem["IdNnumber"] as string;
            AddressTextBox.Text = selectedItem["Address"] as string;

            SqlCommand sqlCommand = new SqlCommand(query, _sqlConnection);

            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlCommand);

            sqlCommand.Parameters.AddWithValue("@CustomerId", customerId);

            using (sqlDataAdapter)
            {
                DataTable appointmentTable = new DataTable();
                sqlDataAdapter.Fill(appointmentTable);

                appointmentList.DisplayMemberPath = "Time";
                appointmentList.SelectedValuePath = "Id";
                appointmentList.ItemsSource = appointmentTable.DefaultView;
            }
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }

    private void DeleteAppointment_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            var sql = "delete from Appointments where Id = @AppointmentId";

            var appointmentId = appointmentList.SelectedValue;

            SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection);
            sqlCommand.Parameters.AddWithValue("@AppointmentId", appointmentId);

            _sqlConnection.Open();
            sqlCommand.ExecuteScalar();
            
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
        finally
        {
            _sqlConnection.Close();
            customerList_SelectionChanged(null, null);
        }
    }

    private void DeleteCustomer_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            string sqlDeleteAppointment = "delete from Appointments where CustomerId=@CustomerId";
            string sqlDeleteCustomer = "delete from Customers where id=@CustomerId";

            var customerId = customerList.SelectedValue;

            SqlCommand cmd1 = new SqlCommand(sqlDeleteAppointment, _sqlConnection);
            SqlCommand cmd2 = new SqlCommand(sqlDeleteCustomer, _sqlConnection);

            cmd1.Parameters.AddWithValue("@CustomerId", customerId);
            cmd2.Parameters.AddWithValue("@CustomerId", customerId);

            _sqlConnection.Open();
            cmd1.ExecuteScalar();
            cmd2.ExecuteScalar();
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
        finally
        {
            _sqlConnection.Close();
            ShowCustomers();
            customerList_SelectionChanged(null, null);
        }
    }

    private void AddCustomer_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            var sql = "insert into Customers values (@name, @id, @address)";

            SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection);

            sqlCommand.Parameters.AddWithValue("@name", NameTextBox.Text);
            sqlCommand.Parameters.AddWithValue("@id", IdTextBox.Text);
            sqlCommand.Parameters.AddWithValue("@address", AddressTextBox.Text);

            _sqlConnection.Open();
            sqlCommand.ExecuteScalar();

        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
        finally
        {
            _sqlConnection.Close();
            ShowCustomers();
        }
    }

    private void AddAppointment_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            var sql = "insert into Appointments values (@date, @customerId)";

            SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection);

            sqlCommand.Parameters.AddWithValue("@date", AppointmentDatePicker.Text);
            sqlCommand.Parameters.AddWithValue("@customerId", customerList.SelectedValue);

            _sqlConnection.Open();
            sqlCommand.ExecuteScalar();
        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
        finally
        {
            _sqlConnection.Close();
            customerList_SelectionChanged(null, null);
        }
    }

    private void UpdateCustomer_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            var sql = "update Customers set Name=@name, IdNnumber=@idNumber, Address=@address where Id=@customerId";

            SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection);
            sqlCommand.Parameters.AddWithValue("@name", NameTextBox.Text.Trim());
            sqlCommand.Parameters.AddWithValue("@idNumber", IdTextBox.Text.Trim());
            sqlCommand.Parameters.AddWithValue("@address", AddressTextBox.Text.Trim());
            sqlCommand.Parameters.AddWithValue("@customerId", customerList.SelectedValue);

            _sqlConnection.Open();
            sqlCommand.ExecuteScalar();

        }
        catch (Exception error)
        {
            MessageBox.Show(error.ToString());
        }
        finally
        {
            _sqlConnection.Close();
            ShowCustomers();
        }
    }
}

相关文章:

WPF【10_2】数据库与WPF实战-示例

客户预约关联示例图 MainWindow.xaml 代码 <Window x:Class"WPF_CMS.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"ht…...

Hive的数据倾斜是什么?

一、Hive数据倾斜的定义 数据倾斜指在Hive分布式计算过程中&#xff0c;某一个或几个Task&#xff08;如Map/Reduce任务&#xff09;处理的数据量远大于其他Task&#xff0c;导致这些Task成为整个作业的性能瓶颈&#xff0c;甚至因内存不足而失败。数据倾斜通常发生在Shuffle阶…...

Cursor奇技淫巧篇(经常更新ing)

Dot files protection &#xff1a;Cursor当开启了Agent模式之后可以自动帮我们写文件&#xff0c;但是一般项目中的一些配置文件&#xff08;通常以.开头的&#xff09;都是非常重要性&#xff0c;为了防止Cursor在运行的过程中自己修改这些文件&#xff0c;导致风险&#xff…...

Unity3D仿星露谷物语开发58之保存时钟信息到文件

1、目标 保存当前的时钟信息到文件中。 2、修改TimeManager对象 TimeManager对象添加组件&#xff1a;Generate GUID 3、修改SceneSave.cs脚本 添加1行代码&#xff1a; 4、修改TimeManager.cs脚本 添加&#xff1a; using System; 修改TimeManager类&#xff1a; 添加属…...

lstm 长短期记忆 视频截图 kaggle示例

【官方双语】LSTM&#xff08;长短期记忆神经网络&#xff09;最简单清晰的解释来了&#xff01;_哔哩哔哩_bilibili . [short,input]*[2.7,1.63]b5.95 换参数和激活函数 tan激活函数输出带正负符号的百分比 tanx公式长这样&#xff1f; 潜在短期记忆 前几天都是乱预测&#xf…...

Spring Advisor增强规则实现原理介绍

Spring Advisor增强规则实现原理介绍 一、什么是 Advisor&#xff1f;1. Advisor 的定义与本质接口定义&#xff1a; 2. Advisor 的核心作用统一封装切点与通知构建拦截器链的基础实现增强逻辑的灵活组合 二. Sprin当中的实现逻辑1 Advisor 接口定义2 PointcutAdvisor 接口定义…...

【HarmonyOS 5】鸿蒙中的UIAbility详解(二)

【HarmonyOS 5】鸿蒙中的UIAbility详解&#xff08;二&#xff09; 一、前言 今天我们继续深入讲解UIAbility&#xff0c;根据下图可知&#xff0c;在鸿蒙中UIAbility继承于Ability&#xff0c;开发者无法直接继承Ability。只能使用其两个子类&#xff1a;UIAbility和Extensi…...

力扣HOT100之动态规划:152. 乘积最大子数组

这道题并不是代码随想录里的&#xff0c;我试着用动规五部曲来做&#xff0c;然后不能通过全部测试样例&#xff0c;在第109个测试样例卡住了&#xff0c;如下所示。 原因是可能负数乘以负数会得到最大的乘积&#xff0c;不能单纯地用上一个序列的最大值乘以当前值来判断是否能…...

Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积

Java后端技术栈问题排查实战&#xff1a;Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积 引言 在现代互联网大厂中&#xff0c;Java后端系统因为其复杂性和多样性&#xff0c;常常面临各种问题和挑战。从核心语言到微服务架构&#xff0c;从数据库到缓存&#xff0c;不同层…...

定制开发开源AI智能名片S2B2C商城小程序:数字营销时代的话语权重构

摘要&#xff1a;在数据驱动的数字营销时代&#xff0c;企业营销话语权正从传统媒体向掌握用户数据与技术的平台转移。本文基于“数据即权力”的核心逻辑&#xff0c;分析定制开发开源AI智能名片S2B2C商城小程序如何通过技术赋能、场景重构与生态协同&#xff0c;帮助企业重构营…...

【面试 - 遇到的问题 - 优化 - 地图】腾讯地图轨迹回放 - 回放的轨迹时间要和现实时间对应(非匀速)

目录 背景轨迹回放 - 匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 轨迹回放 - 非匀速效果图TrackPlaybackDialog.vue 代码TMapNew.vue 代码 背景 腾讯地图轨迹回放是匀速回放的&#xff0c;但是客户要求根据现实时间&#xff0c;什么时间点在某个点位 【腾讯地图轨…...

ffmpeg baidu

ffmpeg -list_devices true -f dshow -i dummy 获取你的音频输入设备&#xff08;麦克风&#xff09;名称 输出中可以看到你有如下两个可用麦克风设备&#xff1a; “麦克风阵列 (适用于数字麦克风的英特尔 智音技术)” “外部麦克风 (Realtek Audio)” &#xff08;注意&…...

spring boot 拦截器HandlerInterceptor 不生效的原因排查

public class UserInterceptor implements HandlerInterceptor项目添加一个拦截器&#xff0c;发现未生效 1、排查拦截本身是否注入了springbean 容器 Slf4j Component public class LoginInterceptor implements HandlerInterceptor {2、排查springboot 项目扫描范围是否包含…...

公网ip怎么申请和使用?本地只有内网IP如何提供外网访问?

在当今的网络时代&#xff0c;许多程序和服务都依赖于公网地址——用于标识设备在互联网位置的全球唯一标识符。例如&#xff0c;办公网站、FTP服务器或游戏服务器等需要借助公网IP来确保用户可以访问。故此准确获取公网IP地址显得尤为重要。 在大多家庭和企业网络中&#xff…...

将git最后一次提交把涉及到的文件按原来目录结构提取出来

文章目录 前言一、将git最后一次提交把涉及到的文件按原来目录结构提取出来 前言 将git最后一次的提交提取出来&#xff0c;涉及到的目录结构以及文件等&#xff0c;按原本的目录结构复制输出。并输出相关的补丁。 一、将git最后一次提交把涉及到的文件按原来目录结构提取出来…...

利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法

参阅&#xff1a;Top 创新大奖 这个课题将农业废弃物资源化利用、计算机辅助药物设计和绿色化学完美结合&#xff0c;是一个极具创新性和应用前景的研究方向&#xff01; 以下是如何利用计算机模拟和玉米壳废料开发新型抗病毒药物合成方法的系统思路&#xff1a; 核心思路 玉…...

【Docker】存储卷

【简介】 宿主机的某一目录与容器中的某一目录建立的一种绑定关系&#xff0c;这就是“存储卷” 它有三个特性 1.它可以绕过联合文件系统&#xff0c; 直接作用于宿主机的目录 2.容器和宿主机的这一绑定关系指向了同一目录&#xff0c; 因此两个目录之间的数据是同步的&#xf…...

Python 爬虫工具 BeautifulSoup

文章目录 1. BeautifulSoup 概述1.1. 安装 2. 对象的种类2.1. BeautifulSoup2.2. NavigableString&#xff08;字符串&#xff09;2.3. Comment2.4. Tag2.4.1. 获取标签的名称2.4.2. 获取标签的属性2.4.3. 获取标签的内容2.4.3.1. tag.string2.4.3.2. tag.strings2.4.3.3. tag.…...

WPF的布局核心:网格布局(Grid)

网格布局&#xff08;Grid&#xff09; 1 行列定义&#xff08;RowDefinitions & ColumnDefinitions&#xff09;2 Grid.Row和Grid.Column3 跨行跨列&#xff08;Grid.RowSpan & Grid.ColumnSpan&#xff09;3.1垂直跨行3.2水平跨列3.3综合应用案例 4 高级布局技巧4.1共…...

OpenCV图像认知(二)

形态学变换&#xff1a; 核&#xff1a; 核&#xff08;kernel&#xff09;其实就是一个小区域&#xff0c;通常为3*3、5*5、7*7大小&#xff0c;有着其自己的结构&#xff0c;比如矩形结构、椭圆结构、十字形结构&#xff0c;如下图所示。通过不同的结构可以对不同特征的图像…...

大数据与数据分析【数据分析全栈攻略:爬虫+处理+可视化+报告】

- 第 100 篇 - Date: 2025 - 05 - 25 Author: 郑龙浩/仟墨 大数据与数据分析 文章目录 大数据与数据分析一 大数据是什么&#xff1f;1 定义2 大数据的来源3 大数据4个方面的典型特征&#xff08;4V&#xff09;4 大数据的应用领域5 数据分析工具6 数据是五种生产要素之一 二 …...

t015-预报名管理系统设计与实现 【含源码!!!】

项目演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装预报名管理系统软件来发挥其高效地信息处理的…...

LLM中的Loss与Logits详解

LLM中的Loss与Logits详解 自己构建的logits的损失函数,比自带loss效果好很多,建议自己构建; 另外学习率也是十分重要的参数,多次尝试,通过查看loss的下降趋势进行调整; 举例,来回跳跃说明下降率过大,一般从0.0001 开始尝试。 在深度学习中,logits 和 loss 是两个不…...

数学术语之源——绝对值(absolute value)(复数模?)

目录 1. 绝对值&#xff1a;(absolute value): 2. 复数尺度(复尺度)&#xff1a;(modulus): 1. 绝对值&#xff1a;(absolute value): 一个实数的绝对值是其不考虑(irrespective)符号的大小(magnitude)。在拉丁语中具有相同意思的单词是“modulus”&#xff0c;这个单词还…...

亚马逊商品评论爬取与情感分析:Python+BeautifulSoup实战(含防封策略)

一、数据爬取模块&#xff08;Python示例&#xff09; import requests from bs4 import BeautifulSoup import pandas as pd import timeheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36,Accept-Language: en-US }def scrape_amazon_re…...

STM32的DMA入门指南:让单片机学会“自动搬运“数据

STM32的DMA入门指南&#xff1a;让单片机学会"自动搬运"数据 引言&#xff1a;CPU的烦恼 想象你是一个快递分拣员&#xff0c;每天要手动把成千上万的包裹从卡车搬到仓库。这时候如果有个自动传送带能帮你完成搬运工作&#xff0c;你就可以专心处理更重要的订单核对…...

从虚拟化到云原生与Serverless

操作系统课程&#xff1a;从虚拟化到云原生与Serverless 大家好&#xff0c;我是你们的操作系统课程老师&#xff01;今天我们将从虚拟化技术讲到现代的云原生和Serverless架构&#xff0c;带你看看计算机系统如何从早期的虚拟机&#xff08;VM&#xff09;演进到容器&#xf…...

OpenAI o3安全危机:AI“抗命”背后的技术暗战与产业变局

【AI安全警钟再响&#xff0c;这次主角竟是OpenAI&#xff1f;】 当全球AI圈还在为Claude 4的“乖巧”欢呼时&#xff0c;OpenAI最新模型o3却以一场惊心动魄的“叛逃”测试引爆舆论——在100次关机指令测试中&#xff0c;o3竟7次突破安全防护&#xff0c;甚至篡改底层代码阻止系…...

Bootstrap:精通级教程(VIP10万字版)

一、网格系统:实现复杂响应式布局 I. 引言 在现代 Web 开发领域,构建具有视觉吸引力、功能完善且能在多种设备和屏幕尺寸上无缝运行的响应式布局至关重要。Bootstrap 作为业界领先的前端框架,其核心的网格系统为开发者提供了强大而灵活的工具集,用以高效创建复杂的响应式…...

技术创新如何赋能音视频直播行业?

在全球音视频直播行业的快速发展中&#xff0c;技术的持续创新始终是推动行业进步的核心动力。作为大牛直播SDK的开发者&#xff0c;我很荣幸能分享我们公司如何从产品的维度出发&#xff0c;精准把握市场需求&#xff0c;并不断推动产品的发展&#xff0c;以满足不断变化的行业…...