sql数据库更新做保存的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql数据库更新做保存的问题相关的知识,希望对你有一定的参考价值。

当对表中数据做了更改后,关闭查询分析器时会弹出一对话框提示是否要保存更改。问题是:我是过不做保存就退出但下次再使用该表时所用到的数据都是已更新了的,那想了解做了更新与没有做更新有什么不同?

参考技术A 由于SQL2000里面没有"自动编号",所以你的以"自动编号"设置的字段都会变成非空的字段,这就必须手工修改这些字段,并把他的"标示"选择"是",种子为"1",增量为"1",
2,另外,ACCESS2000转换成SQL2000后,原来属性为"是/否"的字段将被转换成非空的"bit",这时候你必须修改成自己想要的属性了;
ACCESS转SQL SERVER中的一些经验
1.ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号! 2.转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。我遇见这种情况,用smalldatetime型时,转化失败,而用datetime型时,转化成功。
3.对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:"delete * from user where id=10",而对SQL SERVER数据库进行删除是用:"delete user where id=10".
4.日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对
SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
5.在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用。
1、必须先安装Microsoft Office Access 2003,和SQL Server2000。2、把旧的动网数据库备份,备份完成后,用Access 2003打开动网旧数据库,在打开时会出现一个警告,不要理会它(安全警告),按打开键,打开后按工具栏——数据库实用工具——转换数据库——转换为2002-2003格式,把数据库转换成2003格式。
2、转换完成后再用Access 2003打开,打开后按工具栏——数据库实用工具——升迁向导——新建数据库——填写SQL数据库登陆名称、密码和要新建的动网数据库(准备转成新的动网数据库),按下一步,按“ 》”键,再按下一步,选取所有选项,再按下一步,选择“不对应用程序作任何改动”,再按完成。
3、打开SQL企业管理器——数据库��吹礁詹判陆ǖ亩���菘饬税桑�慊髡飧鍪�菘庖幌拢�缓笤诠ぞ呃浮���?/FONT>SQL脚本——常规——全部显示——编写全部对象脚本——确定(记住存放的位置)。
4、用记事本打开刚才生成的SQL脚本,在编辑栏——替换——查找内容为“smalldatetime”替换为“datetime”——替换全部;完成后再在编辑栏——替换——查找内容为“nvarchar”替换为“varcha”——替换全部,完成后保存退出。
5、打开SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后在工具栏——SQL查询分析器——文件——打开——“刚才生成的SQL脚本”——查询——执行,然后关闭窗口。
6、再回到SQL企业管理器——数据库——点击这个数据库一下新建的动网数据库,然后打开工具栏——数据库转换服务——导入数据——下一步——数据源“Microsoft Access”文件名“为旧的动网数据库”——下一步——再下一步——从源数据复制表和视图——下一步——全选——下一步——立即运行——下一步——完成。
7、修改动网文件夹两个文件conn.asp和inc\const.asp。

SQL是Structured Quevy Language(结构化查询语言)的缩写。SQL是专��菘舛��⒌牟僮髅�罴��且恢止δ芷肴�氖�菘庥镅浴T谑褂盟�保�恍枰�⒊觥白鍪裁础钡拿�睿�霸趺醋觥笔遣挥檬褂谜呖悸堑摹�QL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。 <br>
##1 二、SQL数据库数据体系结构 <br>
SQL数据库的数据体系结构基本上是三级结构,但使用术语与传统关系模型术语不同。在SQL中,关系模式(模式)称为“基本表”(base table);存储模式(内模式)称为“存储文件”(stored file);子模式(外模式)称为“视图”(view);元组称为“行”(row);属性称为“列”(column)。名称对称如^00100009a^: <br>
##1 三、SQL语言的组成 <br>
在正式学习SQL语言之前,首先让我们对SQL语言有一个基本认识,介绍一下SQL语言的组成: <br>
1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义。 <br>
2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项。 <br>
3.一个表或者是一个基本表或者是一个视图。基本表是实际存储在数据库的表,而视图是由若干基本表或其他视图构成的表的定义。 <br>
4.一个基本表可以跨一个或多个存储文件,一个存储文件也可存放一个或多个基本表。每个存储文件与外部存储上一个物理文件对应。 <br>
5.用户可以用SQL语句对视图和基本表进行查询等操作。在用户角度来看,视图和基本表是一样的,没有区别,都是关系(表格)。 <br>
6.SQL用户可以是应用程序,也可以是终端用户。SQL语句可嵌入在宿主语言的程序中使用,宿主语言有FORTRAN,COBOL,PASCAL,PL/I,C和Ada语言等。SQL用户也能作为独立的用户接口,供交互环境下的终端用户使用。 <br>
##1 四、对数据库进行操作 <br>
SQL包括了所有对数据库的操作,主要是由4个部分组成: <br>
1.数据定义:这一部分又称为“SQL DDL”,定义数据库的逻辑结构,包括定义数据库、基本表、视图和索引4部分。 <br>
2.数据操纵:这一部分又称为“SQL DML”,其中包括数据查询和数据更新两大类操作,其中数据更新又包括插入、删除和更新三种操作。 <br>
3.数据控制:对用户访问数据的控制有基本表和视图的授权、完整性规则的描述,事务控制语句等。 <br>
4.嵌入式SQL语言的使用规定:规定SQL语句在宿主语言的程序中使用的规则。 <br>
下面我们将分别介绍: <br>
##2 (一)数据定义 <br>
SQL数据定义功能包括定义数据库、基本表、索引和视图。 <br>
首先,让我们了解一下SQL所提供的基本数据类型:(如^00100009b^) <br>
1.数据库的建立与删除 <br>
(1)建立数据库:数据库是一个包括了多个基本表的数据集,其语句格式为: <br>
CREATE DATABASE <数据库名> 〔其它参数〕 <br>
其中,<数据库名>在系统中必须是唯一的,不能重复,不然将导致数据存取失误。〔其它参数〕因具体数据库实现系统不同而异。 <br>
例:要建立项目管理数据库(xmmanage),其语句应为: <br>
CREATE DATABASE xmmanage <br>
(2) 数据库的删除:将数据库及其全部内容从系统中删除。 <br>
其语句格式为:DROP DATABASE <数据库名> <br>
例:删除项目管理数据库(xmmanage),其语句应为: <br>
DROP DATABASE xmmanage <br>
2.基本表的定义及变更 <br>
本身独立存在的表称为基本表,在SQL语言中一个关系唯一对应一个基本表。基本表的定义指建立基本关系模式,而变更则是指对数据库中已存在的基本表进行删除与修改

更新 DATAGRID 行以保存到 SQL

【中文标题】更新 DATAGRID 行以保存到 SQL【英文标题】:Updating DATAGRID row to save to SQL 【发布时间】:2016-09-04 03:01:24 【问题描述】:

大家好,我正在尝试了解如何将行保存和编辑到数据库中

private void BudgetGrid_RowEditEnding(object sender,
    DataGridRowEditEndingEventArgs e)

    SqlCommand gridcmd = new SqlCommand();
    SqlConnection rwConn = null;
    rwConn = new SqlConnection("server=localhost;" +
    "Trusted_Connection=yes;" + "database=Production; " + "connection
    timeout=30");
    gridcmd.Connection = rwConn;
    rwConn.Open();
    //gridcmd.CommandText =
    //"SELECT Id, Name, Quantity, Rate, Time FROM Budget";
    gridcmd.CommandText =
    "UPDATE Budget SET Id = @id, Name = @Name, " +
    "Quantity = @Qty, Rate = @Rte WHERE Time = @Time";

    SqlDataAdapter gridda = new SqlDataAdapter(gridcmd);
    string strId = "@id".ToString();
    int intID;
    bool bintID = Int32.TryParse(strId, out intID);
    string strName = "@Name".ToString();
    string strQty = "@Qty".ToString();
    int intQty;
    bool bintQty = Int32.TryParse(strQty, out intQty);
    string strRte = "@Rte".ToString();
    int intRte;
    bool bintRte = Int32.TryParse(strRte, out intRte);
    string strTime = "@Time".ToString();
    gridda.SelectCommand.Parameters.Add(
        new SqlParameter("@id", SqlDbType.Int));
    gridda.SelectCommand.Parameters["@id"].SqlValue = intID;
    gridda.SelectCommand.Parameters.Add(
        new SqlParameter("@Name", SqlDbType.VarChar));
    gridda.SelectCommand.Parameters["@Name"].SqlValue = strName;
    gridda.SelectCommand.Parameters.Add(
        new SqlParameter("@Qty", SqlDbType.Int));
    gridda.SelectCommand.Parameters["@Qty"].SqlValue = strQty;
    gridda.SelectCommand.Parameters.Add(
        new SqlParameter("@Rte", SqlDbType.Int));
    gridda.SelectCommand.Parameters["@Rte"].SqlValue = strRte;
    gridda.SelectCommand.Parameters.Add(
        new SqlParameter("@Time", SqlDbType.VarChar));
    gridda.SelectCommand.Parameters["@Time"].SqlValue = strTime;
    DataTable griddt = new DataTable("Budget");
    gridda.Fill(griddt);
    gridda.UpdateCommand =
        new SqlCommandBuilder(gridda).GetUpdateCommand();
    BudgetGrid.ItemsSource = griddt.DefaultView;
    gridda.Update(griddt);
    rwConn.Close();

显示正常。我可以编辑它,但是当我点击另一个选项卡时它不会更新它会返回到原始数据。

我浏览过的大部分代码要么已经过时,要么不是我想要的。

所以这里是数据库

这是应用程序

所以基本上如果我点击标签到下一行。在BudgetGrid_RowEditEnding 事件下,它应该更新数据库.. 但现在不是。

【问题讨论】:

您能否提供更多详细信息?我看不到您的更新查询。 我看到每个人都在 SQL 中使用更新查询,但是当我使用 cmd = new SqlCommand("UPDATE Budget", uniConn); 时,它只会给出一个错误 【参考方案1】:
SqlConnection uniConn = null;
SqlCommand cmd = null;
SqlDataAdapter sda = null;
DataTable dt = new DataTable();
uniConn = new SqlConnection(
    "server=localhost;" + "Trusted_Connection=yes;" +
    "database=Production; " + "connection timeout=30");
cmd = new SqlCommand("UPDATE Budget(id, Name, Quantity, Rate, Time)",
    uniConn);
uniConn.Open();
sda = new SqlDataAdapter(cmd);
sda.Fill(dt);
BudgetGrid.ItemsSource = dt.DefaultView;
uniConn.Close();

你忘记关闭连接了吗?

【讨论】:

如果此代码示例对您有帮助,请将此标记为答案。 这不是我要找的……我会告诉你的。更新帖子。 你忘记关闭连接了吗? 不可以看到连接已关闭uniConn.Close(); 我在回答中添加了这一点。您的实际帖子中没有uniConn.Close();【参考方案2】:

只需复制以下代码。我已经创建了你的所有东西并成功测试。而不是第一种方式,我试图让你走更流行的方式。因此,我花了一些时间来采用..

希望对你有帮助!

SqlDataAdapter da;
DataTable dt;

    private void Window_Loaded(object sender, RoutedEventArgs e)
    
        SqlConnection Conn = new SqlConnection();
        Conn.ConnectionString = yourConnectionString;
        Conn.Open();

        SqlCommand gridcomm = new SqlCommand();
        gridcomm.Connection = Conn;

        gridcomm.CommandText = "SELECT Id, Name, Quantity, Rate, Time FROM Budget";

        da = new SqlDataAdapter(gridcomm);

        SqlDataReader gridreader = gridcomm.ExecuteReader();
        while (gridreader.Read())
        
        
        gridreader.Close();

        dt= new DataTable("Budget");
        da.Fill(dt);

        dataGrid_Budget.ItemsSource = dt.DefaultView;

        Conn.Close();

    

    private void dataGrid_Budget_RowEditEnding(object sender, System.Windows.Controls.DataGridRowEditEndingEventArgs e)
    
        DataGridRow editedrow = e.Row;

        int row_index = (DataGrid)sender).ItemContainerGenerator.IndexFromContainer(editedrow);

        for (int k=0;k< 5;k++)
        
            DataGridCell cell = GetCell(row_index, k);
            TextBlock tb = cell.Content as TextBlock;

            if (k==1)
            
                dt.Rows[row_index][k] = tb.Text;
            
            else if (k == 4)
            
                if (tb.Text != "")
                
                    dt.Rows[row_index][k] = Convert.ToDateTime(tb.Text);
                
            
            else
            
                dt.Rows[row_index][k] = Convert.ToInt32(tb.Text);
            
        

        da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();

        da.Update(dt);
    




    public DataGridCell GetCell(int row, int column)
    
        DataGridRow rowContainer = GetRow(row);

        if (rowContainer != null)
        
            DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer);

            DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            if (cell == null)
            
                dataGrid_Budget.ScrollIntoView(rowContainer, dataGrid_Budget.Columns[column]);
                cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
            
            return cell;
        
        return null;
    

    public DataGridRow GetRow(int index)
    
        DataGridRow row = (DataGridRow)dataGrid_Budget.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        
            dataGrid_Budget.UpdateLayout();
            dataGrid_Budget.ScrollIntoView(dataGrid_Budget.Items[index]);
            row = (DataGridRow)dataGrid_Budget.ItemContainerGenerator.ContainerFromIndex(index);
        
        return row;
    

    public static T GetVisualChild<T>(Visual parent) where T : Visual
    
        T child = default(T);
        int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < numVisuals; i++)
        
            Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
            child = v as T;
            if (child == null)
            
                child = GetVisualChild<T>(v);
            
            if (child != null)
            
                break;
            
        
        return child;
    

【讨论】:

请注意,如果您在完成编辑之前移动另一行,您会看到 FormatException,但如果您在完成编辑后单击另一行就可以了。您可以使用 try 包装代码,然后 catch(FormatException)MessageBox.Show("请先完成编辑!"); 或者您可以通过好的关键字在 Google 上进行研究。 哇兄弟没想到你写了整个代码>。 很少有红色的东西..它不起作用..但你给了...比我要求的要多得多:D谢谢芽。我可以看到如何以及在哪里进行。 我无法向上箭头,我只有 14 个代表 谢谢,标记就足够了。你能告诉我红色的名字吗?如果您将鼠标放在它上面,Visual Studio 会自动建议您更正这些问题。在另外 3 种方法中,只需按照 Visual Studio 的建议添加一些所需的程序集,然后使用它的命名空间来使用 3 种其他方法,红色的东西就可以消失。【参考方案3】:

您的 SQL 语法必须像这样更正,

SqlCommand update_comm = new SqlCommand();
update_comm.Connection = Conn;
update_comm.CommandText = "UPDATE Budget SET id= @u_id, Name= @u_name  WHERE person= @psn";

var update_da = new SqlDataAdapter(update_comm);
update_da.SelectCommand.Parameters.Add(new SqlParameter("@u_id", SqlDbType.Int));
update_da.SelectCommand.Parameters["@u_id"].Value = yourintvalue;

update_da.SelectCommand.Parameters.Add(new SqlParameter("@u_name", SqlDbType.NVarChar));
update_da.SelectCommand.Parameters["@u_name"].Value = yourstringvalue;

update_da.SelectCommand.Parameters.Add(new SqlParameter("@psn", SqlDbType.NVarChar));
update_da.SelectCommand.Parameters["@psn"].Value = yourstringvalue;

var update_ds = new DataSet();
update_da.Fill(update_ds);

'UPDATE' 应与'SET' 一起使用。

如果你想用 DataGrid 的编辑行的值更新实际的 SQL 数据库,请试试这个。

da.UpdateCommand = new SqlCommandBuilder(da).GetUpdateCommand();

da.Update(griddt); 

【讨论】:

我不明白 WHERE 部分.. 如果我希望它占据整行...并更新它以发布图片 第二部分是我想做的,但是 DA 在哪里声明?我会在哪里使用它? hmm..第二部分可能用于更新整个表。因为您正在尝试使用 RowEditEnding,所以 WHERE 应该是 id= @k_id 以指示已编辑的行。我的建议是将数据表声明为类(事件之外)的字段中的全局变量,以在事件或方法之间共享值。然后你编辑DataGrid(数据表在里面),并运行带有编辑值的UPDATE命令,比如dt.Rows[0][1],这意味着第一行和第二列的值(从零开始的索引)。手动更新并手动从 SQL 数据库加载数据。否则,您需要尝试第二部分。 我不熟悉 SqlCommandBuilder。对不起,但是 where 应该是你使用的本地变量或我评论的全局变量。我的应用程序代码的方向使我对此不熟悉。但是,如果您有兴趣,您需要进行研究,可以参考我的案例***.com/questions/35835567/… 我将 DataTable 加载到 DataGrid 并更改了值并运行了 SqlCommandBuilder 代码。实际的 SQL 数据库已根据我的问题的标题进行了更新。 我建议你获取 DataTable dt = new DataTable();在加载事件之外并在 Class 的字段中声明为全局变量,以便您可以使用 DataTable 的初始值或编辑值。如果您手动更新 SQL 数据库并将 SQL 数据库的数据手动加载到 DataGrid(DataTable) 中,这应该可以工作,因为它是基本和直接的方式。现在,我还测试了将 DataTable 外部事件声明为 DataTable dt_budget 类的字段;

以上是关于sql数据库更新做保存的问题的主要内容,如果未能解决你的问题,请参考以下文章

保存选择查询中的值,然后在更新查询 SQL Server CE 中使用它们

更新 DATAGRID 行以保存到 SQL

SQL:将列中的 Unicode 数据更新为重音字符

SQL 为值更改的列保存影子表

在jTable(自动保存)中编辑后,如何将单元格中的数据保存在sql中?

EF4 与 SQL Compact 4,rowversion 在保存时不更新