怎么更新SQL2008里指定行列的数据,数据库用的很少,我用的VB编写,求教大神

怎么更新SQL2008里指定行列的数据,数据库用的很少,我用的VB编写,求教大神,第1张

1)窗体上插入3个标签,2个文本框,14个按钮,1个隐藏的复选框,设置密码框的输入掩码为密码

2)通过文本框的获得焦点事件设置隐藏复选框的值,以根据复选框的值确定当前被激活的是哪个文本框

Private Sub Text0_GotFocus()

MeCheck9Value = True

End Sub

Private Sub Text2_GotFocus()

MeCheck9Value = False

End Sub

3)设置数字按钮/退格按钮/清除按钮/取消按钮的单击事件代码:

Private Sub Command4_Click()

Dim myCtrl As Control

If MeCheck9Value = True Then

Set myCtrl = MeText0

Else

Set myCtrl = MeText2

End If

myCtrlValue = myCtrlValue & "1"

Set myCtrl = Nothing

End Sub

退格: myCtrlValue = Left(myCtrlValue, Len(myCtrlValue) - 1)

清除: myCtrlValue = ""

取消: DoCmdClose acForm, MeName, acSaveNo

4)确认键的单击事件代码就根据需要了

update product set

xxx=(select xxx from product where id_lang=1),

yyy=(select yyy from product where id_lang=1),

zzz=(select zzz from product where id_lang=1)

where id_lang=7

一、使用嵌入式关系型SQLite数据库存储数据

在Android平台上,集成了一个嵌入式关系型数据库——SQLite,SQLite3支持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略name字段的类型信息:

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

SQLite可以解析大部分标准SQL语句,如:

复制代码 代码如下:

查询语句:select from 表名 where 条件子句 group by 分组字句 having order by 排序子句

如: select from person

select from person order by id desc

select name from person group by name having count()>1

分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录

select from Account limit 5 offset 3 或者 select from Account limit 3,5

插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智',3)

更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10

删除语句:delete from 表名 where 条件子句。如:delete from person where id=10

二、使用SQLiteOpenHelper对数据库进行版本管理

我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。

为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于 *** 作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在 onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。

getWritableDatabase()和 getReadableDatabase()方法都可以获取一个用于 *** 作数据库的SQLiteDatabase实例。但 getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

注意:getWritableDatabase(),getReadableDatabase的区别是当数据库写满时,调用前者会报错,调用后者不会,所以如果不是更新数据库的话,最好调用后者来获得数据库连接。

代码:

复制代码 代码如下:

public class DatabaseHelper extends SQLiteOpenHelper {

//类没有实例化,是不能用作父类构造器的参数,必须声明为静态

private static final String name = "ljqdb"; //数据库名称

private static final int version = 1; //数据库版本

public DatabaseHelper(Context context) {

//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类

super(context, name, null, version);

}

@Override

public void onCreate(SQLiteDatabase db) {

dbexecSQL("CREATE TABLE IF NOT EXISTS person (

personid integer primary key autoincrement, name varchar(20), age INTEGER)");

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

dbexecSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列

// DROP TABLE IF EXISTS person 删除表

}

}

在实际项目开发中,当数据库表结构发生更新时,应该避免用户存放于数据库中的数据丢失。

三、使用SQLiteDatabase *** 作SQLite数据库

Android提供了一个名为SQLiteDatabase的类,该类封装了一些 *** 作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete) *** 作(这些 *** 作简称为CRUD)。对SQLiteDatabase的学习,我们应该重点掌握execSQL()和rawQuery()方法。execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。

execSQL()方法的使用例子:

复制代码 代码如下:

SQLiteDatabase db = ;

dbexecSQL("insert into person(name, age) values('林计钦', 24)");

dbclose();

执行上面SQL语句会往person表中添加进一条记录,在实际应用中, 语句中的“林计钦”这些参数值会由用户输入界面提供,如果把用户输入的内容原样组拼到上面的insert语句, 当用户输入的内容含有单引号时,组拼出来的SQL语句就会存在语法错误。要解决这个问题需要对单引号进行转义,也就是把单引号转换成两个单引号。有些时候用户往往还会输入像“ & ”这些特殊SQL符号,为保证组拼好的SQL语句语法正确,必须对SQL语句中的这些特殊SQL符号都进行转义,显然,对每条SQL语句都做这样的处理工作是比较烦琐的。 SQLiteDatabase类提供了一个重载后的execSQL(String sql, Object[] bindArgs)方法,使用这个方法可以解决前面提到的问题,因为这个方法支持使用占位符参数()。使用例子如下:

复制代码 代码如下:

SQLiteDatabase db = ;

dbexecSQL("insert into person(name, age) values(,)", new Object[]{"传智播客", 4});

dbclose();

execSQL(String sql, Object[] bindArgs)方法的第一个参数为SQL语句,第二个参数为SQL语句中占位符参数的值,参数值在数组中的顺序要和占位符的位置对应。

SQLiteDatabase的rawQuery()用于执行select语句,使用例子如下:

复制代码 代码如下:

SQLiteDatabase db = ;

Cursor cursor = dbrawQuery("select from person", null);

while (cursormoveToNext()) {

int personid = cursorgetInt(0); //获取第一列的值,第一列的索引从0开始

String name = cursorgetString(1);//获取第二列的值

int age = cursorgetInt(2);//获取第三列的值

}

cursorclose();

dbclose();

rawQuery()方法的第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null。带占位符参数的select语句使用例子如下:

复制代码 代码如下:

Cursor cursor = dbrawQuery("select from person where name like and age=", new String[]{"%林计钦%", "4"});

Cursor是结果集游标,用于对结果集进行随机访问,如果大家熟悉jdbc, 其实Cursor与JDBC中的ResultSet作用很相似。使用moveToNext()方法可以将游标从当前行移动到下一行,如果已经移过了结果集的最后一行,返回结果为false,否则为true。另外Cursor 还有常用的moveToPrevious()方法(用于将游标从当前行移动到上一行,如果已经移过了结果集的第一行,返回值为false,否则为true )、moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )和moveToLast()方法(用于将游标移动到结果集的最后一行,如果结果集为空,返回值为false,否则为true ) 。

除了前面给大家介绍的execSQL()和rawQuery()方法, SQLiteDatabase还专门提供了对应于添加、删除、更新、查询的 *** 作方法: insert()、delete()、update()和query() 。这些方法实际上是给那些不太了解SQL语法的菜鸟使用的,对于熟悉SQL语法的程序员而言,直接使用execSQL()和rawQuery()方法执行SQL语句就能完成数据的添加、删除、更新、查询 *** 作。

GBase 8s数据库执行统计更新时会更新以下表的以下列

1systables

nrows 表行数

npused 表使用的数据页

ustlowts 统计信息最后收集时间

2sysindices 

levels 索引层数

leaves B+树叶子结点数

nunique 索引首字段唯一值个数

clust 数据聚集深度

nrows 表行数

ustlowts 统计信息最后收集时间

3syscolumns 

colmin 列次小值(索引字段)

colmax 列次大值(索引字段)

4sysfragments 

nrows 表或索引行数

npused 表或索引使用的数据页

levels 索引层数

clust 索引数据聚集深度

5sysdistrib

所有字段 update statistics medium(high)才更新

综合你的问题,提出如下解决办法:

先将A、B表都有的产品在B表中进行累加,代码如下(mssql适用,oracle、DB2不适用):update B表 set b入库总数量=b入库总数量+a入库总数量,b库存总金额=b库存总金额+a库存总金额 from B表 as b,(select 料号,sum (入库数量) as 入库总数量,sum(总金额) as 库存总金额 from 表A group by 料号) as a where b料号=a料号

再解决新产品问题,即进货表(A表)有,而库存表(B表)没有的产品。代码如下:   select 料号 from A表 where 料号 not in (select 料号 from B表)//如果有数据则执行下面一行

insert into 表B(料号,名称,规格,入库总数量,库存总金额) select 料号,名称,规格,sum(入库数  量),sum(总金额) from 表A where 料号 not in (select 料号 from B表)group by 料号,名称,规格

写成动态SQL就是:

(第一句不变)

update B表 set b入库总数量=b入库总数量+a入库总数量,b库存总金额=b库存总金额+a库存总金额 from B表 as b,(select 料号,sum (入库数量) as 入库总数量,sum(总金额) as 库存总金额 from 表A group by 料号) as a where b料号=a料号

if exist(select 料号 from A表 where 料号 not in (select 料号 from B表))

begin

insert into 表B(料号,名称,规格,入库总数量,库存总金额) select 料号,名称,规格,sum(入库数量),sum(总金额) from 表A where 料号 not in (select 料号 from B表)group by 料号,名称,规格

end

以上就是关于怎么更新SQL2008里指定行列的数据,数据库用的很少,我用的VB编写,求教大神全部的内容,包括:怎么更新SQL2008里指定行列的数据,数据库用的很少,我用的VB编写,求教大神、求 mysql数据库里将一行数据的某些列更新到另外一行的对应某些列的sql语句、android sqlite数据库的更新等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/sjk/10630002.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存