asp.net pdf viewer user control : Can't view pdf thumbnails software SDK project winforms .net azure UWP guide11-part65

Access Control
98
Revoke a role from users or roles.
Can't view pdf thumbnails - software SDK project:C# PDF Thumbnail Create SDK: Draw thumbnail images for PDF in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
www.rasteredge.com
Can't view pdf thumbnails - software SDK project:VB.NET PDF Thumbnail Create SDK: Draw thumbnail images for PDF in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Thumbnail Generation with Various Options for Quick PDF Navigation
www.rasteredge.com
99
Chapter 7. Data Access and Change
Fred Toussi, The HSQL Development Group
$Revision: 5482 $
Copyright 2010-2015 Fred Toussi. Permission is granted to distribute this document without any alteration
under the terms of the HSQLDB license. Additional permission is granted to the HSQL Development Group
to distribute this document with or without alterations under the terms of the HSQLDB license.
2015-06-29 22:26:45-0400
Overview
HyperSQL data access and data change statements are fully compatible with the latest SQL:2011 Standard. There
are a few extensions and some relaxation of rules, but these do not affect statements that are written to the Standard
syntax. There is full support for classic SQL, as specified by SQL-92, and many enhancements added in later versions
of the standard.
Cursors And Result Sets
An  SQL  statement  can  be  executed  in  two  ways.  One  way  is  to  use  the  java.sql.Statement
interface. The Statement object can be reused to execute completely different SQL statements. Alternatively a
PreparedStatment can be used to execute an SQL statement repeatedly, and the statements can use parameters.
Using either form, if the SQL statement is a query expression, a ResultSet is returned.
In SQL, when a query expression (SELECT or similar SQL statement) is executed, an ephemeral table is created.
When this table is returned to the application program, it is returned as a result set, which is accessed row-by-row by
a cursor. A JDBC ResultSet represents an SQL result set and its cursor.
The minimal definition of a cursor is a list of rows with a position that can move forward. Some cursors also allow
the position to move backwards or jump to any position in the list.
An SQL cursor has several attributes. These attributes depend on the query expression. Some of these attributes can
be overridden by specifying qualifiers in the SQL statement or by specifying values for the parameters of the JDBC
Statement or PreparedStatement.
Columns and Rows
The columns of the result set are determined by the query expression. The number of columns and the type and
name characteristics of each column are known when the query expression is compiled and before its execution. This
metadata information remains constant regardless of changes to the contents of the tables used in the query expression.
The metadata for the JDBC ResultSet is in the form of a ResultSetMetaData object. Various methods of the
ResultSetMetaData interface return different properties of each column of the ResultSet.
A result set may contain 0 or more rows. The rows are determined by the execution of the query expression.
The setMaxRows(int) method of JDBC Statement allows limiting the number of rows returned by the
statement. This limit is conceptually applied after the result has been built, and the excess rows are discarded.
Navigation
A cursor is either scrollable or not. Scrollable cursors allow accessing rows by absolute or relative positioning. No-
scroll cursors only allow moving to the next row. The cursor can be optionally declared with the SQL qualifiers
software SDK project:C# PDF copy, paste image Library: copy, paste, cut PDF images in
Description: Extract all images in a PDF document. Parameters: Name, Description, Valid Value. doc, Target document object, Can't be null.
www.rasteredge.com
software SDK project:C# PDF Page Replace Library: replace PDF pages in C#.net, ASP.NET
consecutive pages from the input PDF file starting at specified position. Parameters: Name, Description, Valid Value. newPages, The new page objects. Can't be null
www.rasteredge.com
Data Access and Change
100
SCROLL, or NO SCROLL. The JDBC statement parameter can be specified as: TYPE_FORWARD_ONLY and
TYPE_SCROLL_INSENSITIVE. The JDBC type TYPE_SCROLL_SENSITIVE is not supported by HSQLDB.
The default is NO SCROLL or TYPE_FORWARD_ONLY.
When a JDBC ResultSet is opened, it is positioned before the first row. Using the next() method the position is
moved to the first row. While the ResultSet is positioned on a row, various getter methods can be used to access
the columns of the row.
Updatability
The result returned by some query expressions is updatable. HSQLDB supports core SQL updatability features, plus
some enhancements from the SQL optional features.
A query expression is updatable if it is a SELECT from a single underlying base table (or updatable view) either
directly or indirectly. A SELECT statement featuring DISTINCT or GROUP BY or FETCH, LIMIT, OFFSET is not
updatable. In an updatable query expression, one or more columns are updatable. An updatable column is a column that
can be traced directly to the underlying table. Therefore, columns that contain expressions are not updatable. Examples
of updatable query expressions are given below. The view V is updatable when its query expression is updatable. The
SELECT statement from this view is also updatable:
SELECT A, B FROM T WHERE C > 5
SELECT A, B FROM (SELECT * FROM T WHERE C > 10) AS TT WHERE TT.B <10
CREATE VIEW V(X,Y) AS SELECT A, B FROM T WHERE C > 0 AND B < 10
SELECT X FROM V WHERE Y = 5
If a cursor is declared with the SQL qualifier, FOR UPDATE OF <column name list>, then only the stated
columns in the result set become updatable. If any of the stated columns is not actually updatable, then the cursor
declaration will not succeed.
If the SQL qualifier, FOR UPDATE is used, then all the updatable columns of the result set become updatable.
If a cursor is declared with FOR READ ONLY, then it is not updatable.
In HSQLDB, if FOR READ ONLY or FOR UPDATE is not used then all the updatable columns of the result set
become updatable. This relaxes the SQL standard rule that in this case limits updatability to only simply updatable
SELECT statements (where all columns are updatable).
In JDBC, CONCUR_READ_ONLY or CONCUR_UPDATABLE can be specified for the Statement parameter.
CONCUR_UPDATABLE is required if the returning ResultSet is to be updatable. If CONCUR_READ_ONLY, which
is the default, is used, then even an updatable ResultSet becomes read-only.
When a ResultSet is updatable, various setter methods can be used to modify the column values. The names of
the setter methods begin with "update". After all the updates on a row are done, the updateRow() method must be
called to finalise the row update.
An updatable ResultSet may or may not be insertable-into. In an insertable ResultSet, all columns of the result
are updatable and any column of the base table that is not in the result must be a generated column or have a default
value.
In the ResultSet object, a special pseudo-row, called the insert row, is used to populate values for insertion into the
ResultSet (and consequently, into the base table). The setter methods must be used on all the columns, followed
by a call to insertRow().
Individual rows from all updatable result sets can be deleted one at a time. The deleteRow() is called when the
ResultSet is positioned on a row.
Data Access and Change
101
While using an updatable ResultSet to modify data, it is recommended not to change the same data using another
ResultSet and not to execute SQL data change statements that modify the same data.
Sensitivity
The sensitivity of the cursor relates to visibility of changes made to the data by the same transaction but without using
the given cursor. While the result set is open, the same transaction may use statements such as INSERT or UPDATE,
and change the data of the tables from which the result set data is derived. A cursor is SENSITIVE if it reflects those
changes. It is INSENSITIVE if it ignores such changes. It is ASENSITIVE if behaviour is implementation dependent.
The SQL default is ASENSITIVE, i.e., implantation dependent.
In HSQLDB all cursors are INSENSITIVE. They do not reflect changes to the data made by other statements.
Holdability
A cursor is holdable if the result set is not automatically closed when the current transaction is committed. Holdability
can be specified in the cursor declaration using the SQL qualifiers WITH HOLD or WITHOUT HOLD.
In  JDBC,  holdability  is  specified  using  either  of  the  following  values  for  the  Statement  parameter:
HOLD_CURSORS_OVER_COMMIT, or CLOSE_CURSORS_AT_COMMIT.
The SQL default is WITHOUT HOLD.
The JDBC default for HSQLDB result sets is WITH HOLD for read-only result sets and WITHOUT HOLD for
updatable result sets.
If the holdability of a ResultSet  is  specified in a conflicting manner in the SQL statement and the JDBC
Statement object, the JDBC setting takes precedence.
Autocommit
The autocommit property of a connection is a feature of JDBC and ODBC and is not part of the SQL Standard.
In autocommit mode, all transactional statements are followed by an implicit commit. In autocommit mode, all
ResultSet objects are read-only and holdable.
JDBC Overview
The JDBC settings, ResultSet.CONCUR_READONLY and ResultSet.CONCUR_UPDATABLE are the available
alternatives for read-only or updatability. The default is ResultSet.CONCUR_READONLY.
The  JDBC  settings,  ResultSet.TYPE_FORWARD_ONLY,  ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.TYPE_SCROLL_SENSITIVE  are  the  available  alternatives  for  both  scrollability  (navigation)  and
sensitivity. HyperSQL does not support ResultSet.TYPE_SCROLL_SENSITIVE. The two other alternatives can be
used for both updatable and read-only result sets.
The 
JDBC 
settings 
ResultSet.CLOSE_CURSORS_AT_COMMIT 
and
ResultSet.HOLD_CURSORS_OVER_COMMIT are the alternatives for the lifetime of the result set. The default is
ResultSet.CLOSE_CURSORS_AT_COMMIT. The other setting can only be used for read-only result sets.
Examples of creating statements for updatable result sets are given below:
Connection c = newConnection();
Statement st;
c.setAutoCommit(false);
st = c.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
st = c.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
Data Access and Change
102
JDBC Parameters
When a JDBC PreparedStatement or  CallableStatement  is  used with an SQL  statement that contains dynamic
parameters, the data types of the parameters are resolved and determined by the engine when the statement is prepared.
The SQL Standard has detailed rules to determine the data types and imposes limits on the maximum length or precision
of the parameter. HyperSQL applies the standard rules with two exceptions for parameters with String and BigDecimal
Java types. HyperSQL ignores the limits when the parameter value is set, and only enforces the necessary limits
when the PreparedStatement is executed. In all other cases, parameter type limits are checked and enforced when the
parameter is set.
In the example below the setString() calls do not raise an exception, but one of the execute() statements does.
// table definition: CREATE TABLE T (NAME VARCHAR(12), ...)
Connection c = newConnection();
PreparedStatement st = c.prepareStatement("SELECT * FROM T WHERE NAME = ?");
// type of the parameter is VARCHAR(12), which limits length to 12 characters
st.setString(1, "Eyjafjallajokull"); // string is longer than type, but no exception is raised
here
set.execute(); // executes with no exception and does not find any rows
// but if an UPDATE is attempted, an exception is raised
st = c.prepareStatement("UPDATE T SET NAME = ? WHERE ID = 10");
st.setString(1, "Eyjafjallajokull"); // string is longer than type, but no exception is raised
here
st.execute(); // exception is thrown when HyperSQL checks the value for update
All of the above also applies to setting the values in new and updated rows in updatable ResultSet objects.
JDBC parameters can be set with any compatible type, as supported by the JDBC specification. For CLOB and BLOB
types, you can use streams, or create instances of BLOB or CLOB before assigning them to the parameters. You can
even use CLOB or BLOB objects returned from connections to other RDBMS servers. The Connection.createBlob()
and createClob() methods can be used to create the new LOBs. For very large LOB's the stream methods are preferable
as they use less memory.
For array parameters, you must use a java.sql.Array object that contains the array elements before assigning to
JDBC parameters. The Connection.createArrayOf(...) method can be used to create a new object, or you
can use an Array returned from connections to other RDBMS servers.
JDBC and Data Change Statements
Data change statements, also called data manipulation statements (DML) such as INSERT, UPDATE, MERGE can
be called with different executeUpdate() methods of java.sql.Statement and java.sql.PreparedStatement. Some of
these methods allow you to specify how values for generated columns of the table are returned. These methods
are documented in the JavaDoc for org.hsqldb.jdbc.JDBCStatement and org.hsqldb.jdbc.JDBCPreparedStatement.
HyperSQL can return not just the generated columns, but any set of columns of the table. You can use this to retrieve
the columns values that may be modified by a BEFORE TRIGGER on the table.
JDBC Callable Statement
The JDBC CallableStatement interface is used to call Java or SQL procedures that have been defined in the database.
The SQL statement is in the form of CALL procedureName ( ... ) with constant value arguments or with parameter
markers. Note that you must use a parameter marker for OUT and INOUT arguments of the procedure you are calling.
The OUT arguments should not be set before executing the callable statement.
After executing the statement, you can retrieve the OUT and INOUT parameters with the appropriate getXXX()
method.
Data Access and Change
103
Procedures can also return one or more result sets. You should call the getResultSet() and getMoreResults() methods
to retrieve the result sets one by one.
SQL functions can also return a table. You can call such functions the same way as procedures and retrieve the table
as a ResultSet.
JDBC Returned Values
The methods of the JDBC ResultSet interface can be used to return values and to convert value to different types as
supported by the JDBC specification.
When a CLOB and BLOB object is returned from a ResultSet, no data is transferred until the data is read by various
methods of java.sql.CLOB and java.sql.BLOB. Data is streamed in large blocks to avoid excessive memory use.
Array objects are returned as instances of java.sql.Array.
Cursor Declaration
The DECLARE CURSOR statement is used within an SQL PROCEDURE body. In the current version HyperSQL
2.3, the cursor is used only to return a result set from the procedure. Therefore the cursor must be declared WITH
RETURN and can only be READ ONLY.
DECLARE CURSOR
declare cursor statement
<declare cursor> ::= DECLARE <cursor name>
[ { SENSITIVE | INSENSITIVE | ASENSITIVE } ] [ { SCROLL | NO SCROLL } ]
CURSOR [ { WITH HOLD | WITHOUT HOLD } ] [ { WITH RETURN | WITHOUT RETURN } ]
FOR <query expression>
[ FOR { READ ONLY | UPDATE [ OF <column name list> ] } ]
The query expression is a SELECT statement or similar, and is discussed in the rest of this chapter. In the example
below a cursor is declared for a SELECT statement. It is later opened to create the result set. The cursor is specified
WITHOUT HOLD, so the result set is not kept after a commit. Use WITH HOLD to keep the result set. Note that you
need to declare the cursor WITH RETURN as it is returned by the CallableStatement.
DECLARE thiscursor SCROLL CURSOR WITHOUT HOLD WITH RETURN FOR SELECT * FROM
INFORMATION_SCHEMA.TABLES;
--
OPEN thiscursor;
Syntax Elements
The syntax elements that can be used in data access and data change statements are described in this section. The SQL
Standard has a very extensive set of definitions for these elements. The BNF definitions given here are sometimes
simplified.
Literals
Literals are used to express constant values. The general type of a literal is known by its format. The specific type
is based on conventions.
Data Access and Change
104
unicode escape elements
unicode escape elements
<Unicode 
escape 
specifier> 
::= 
UESCAPE 
<quote><Unicode 
escape
character><quote> ]
<Unicode escape value> ::= <Unicode 4 digit escape value> | <Unicode 6 digit
escape value> | <Unicode character escape value>
<Unicode 
digit 
escape 
value> 
::= 
<Unicode 
escape
character><hexit><hexit><hexit><hexit>
<Unicode  6  digit  escape  value>  ::=  <Unicode  escape  character><plus  sign>
<hexit><hexit><hexit><hexit><hexit><hexit>
<Unicode character escape value> ::= <Unicode escape character><Unicode escape
character>
<Unicode escape character> ::= a single character than a <hexit> (a-f, A-F,
0-9), <plus sign>, <quote>, <double quote>, or <white space>
character literal
character literal
<character string literal> ::= [ <introducer><character set specification> ]
<quote>  [  <character  representation>...  ]  <quote>  [  {  <separator>  <quote>
[ <character representation>... ] <quote> }... ]
<introducer> ::= <underscore>
<character representation> ::= <nonquote character> | <quote symbol>
<nonquote character> ::= any character apart from the quote symbol.
<quote symbol> ::= <quote><quote>
<national 
character 
string 
literal> 
::= 
<quote> 
<character
representation>...  ]  <quote>  [  {  <separator>  <quote>  [  <character
representation>... ] <quote> }... ]
<Unicode  character  string  literal>  ::=  [  <introducer><character  set
specification> ] U<ampersand><quote> [ <Unicode representation>... ] <quote>
[ { <separator> <quote> [ <Unicode representation>... ] <quote> }... ] <Unicode
escape specifier>
<Unicode representation> ::= <character representation> | <Unicode escape value>
The type of a character literal is CHARACTER. The length of the string literal is the character length of the type. If
the quote character is used in a string, it is represented with two quote characters. Long literals can be divided into
multiple quoted strings, separated with a space or end-of-line character.
Unicode literals start with U& and can contain ordinary characters and unicode escapes. A unicode escape begins with
the backslash ( \ ) character and is followed by four hexadecimal characters which specify the character code.
Example of character literals are given below:
Data Access and Change
105
'a literal'  ' string seperated'  ' into parts'
'a string''s literal form with quote character'
U&'Unicode string with Greek delta \0394 and phi \03a6 letters'
binary literal
binary literal
<binary string literal> ::= X <quote> [ <space>... ] [ { <hexit> [ <space>... ]
<hexit> [ <space>... ] }... ] <quote> [ { <separator> <quote> [ <space>... ]
[ { <hexit> [ <space>... ] <hexit> [ <space>... ] }... ] <quote> }... ]
<hexit> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f
The type of a binary literal is BINARY. The octet length of the binary literal is the length of the type. Case-insensitive
hexadecimal characters are used in the binary string. Each pair of characters in the literal represents a byte in the binary
string. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line character.
X'1abACD34' 'Af'
bit literal
bit literal
<bit string literal> ::= B <quote> [ <bit> ... ] <quote> [ { <separator> <quote>
[ <bit>... ] <quote> }... ]
<bit> ::= 0 | 1
The type of a binary literal is BIT. The bit length of the bit literal is the length of the type. Digits 0 and 1 are used
to represent the bits. Long literals can be divided into multiple quoted strings, separated with a space or end-of-line
character.
B'10001001' '00010'
numeric literal
numeric literal
<signed numeric literal> ::= [ <sign> ] <unsigned numeric literal>
<unsigned numeric literal> ::= <exact numeric literal> | <approximate numeric
literal>
<exact numeric literal> ::= <unsigned integer> [ <period> [ <unsigned integer> ] ]
| <period> <unsigned integer>
<sign> ::= <plus sign> | <minus sign>
<approximate numeric literal> ::= <mantissa> E <exponent>
<mantissa> ::= <exact numeric literal>
<exponent> ::= <signed integer>
<signed integer> ::= [ <sign> ] <unsigned integer>
Data Access and Change
106
<unsigned integer> ::= <digit>...
The type of an exact numeric literal without a decimal point is INTEGER, BIGINT, or DECIMAL, depending on the
value of the literal (the smallest type that can represent the value is the type).
The type of an exact numeric literal with a decimal point is DECIMAL. The precision of a decimal literal is the total
number of digits of the literal. The scale of the literal is the total number of digits to the right of the decimal point.
The type of an approximate numeric literal is DOUBLE. An approximate numeric literal always includes the mantissa
and exponent, separated by E.
12
34.35
+12E-2
boolean literal
boolean literal
<boolean literal> ::= TRUE | FALSE | UNKNOWN
The boolean literal is one of the specified keywords.
datetime and interval literal
datetime and interval literal
<datetime literal> ::= <date literal> | <time literal> | <timestamp literal>
<date literal> ::= DATE <date string>
<time literal> ::= TIME <time string>
<timestamp literal> ::= TIMESTAMP <timestamp string>
<date string> ::= <quote> <unquoted date string> <quote>
<time string> ::= <quote> <unquoted time string> <quote>
<timestamp string> ::= <quote> <unquoted timestamp string> <quote>
<time zone interval> ::= <sign> <hours value> <colon> <minutes value>
<date value> ::= <years value> <minus sign> <months value> <minus sign> <days
value>
<time value> ::= <hours value> <colon> <minutes value> <colon> <seconds value>
<interval literal> ::= INTERVAL [ <sign> ] <interval string> <interval qualifier>
<interval string> ::= <quote> <unquoted interval string> <quote>
<unquoted date string> ::= <date value>
<unquoted time string> ::= <time value> [ <time zone interval> ]
<unquoted timestamp string> ::= <unquoted date string> <space> <unquoted time
string>
Data Access and Change
107
<unquoted interval string> ::= [ <sign> ] { <year-month literal> | <day-time
literal> }
<year-month literal> ::= <years value> [ <minus sign> <months value> ] | <months
value>
<day-time literal> ::= <day-time interval> | <time interval>
<day-time interval> ::= <days value> [ <space> <hours value> [ <colon> <minutes
value> [ <colon> <seconds value> ] ] ]
<time interval> ::= <hours value> [ <colon> <minutes value> [ <colon> <seconds
value> ] ] | <minutes value> [ <colon> <seconds value> ] | <seconds value>
<years value> ::= <datetime value>
<months value> ::= <datetime value>
<days value> ::= <datetime value>
<hours value> ::= <datetime value>
<minutes value> ::= <datetime value>
<seconds value> ::= <seconds integer value> [ <period> [ <seconds fraction> ] ]
<seconds integer value> ::= <unsigned integer>
<seconds fraction> ::= <unsigned integer>
<datetime value> ::= <unsigned integer>
The type of a datetime or interval type is specified in the literal. The fractional second precision is the number of digits
in the fractional part of the literal. Details are described in the  SQL Language  chapter
DATE '2008-08-08'
TIME '20:08:08'
TIMESTAMP '2008-08-08 20:08:08.235'
INTERVAL '10' DAY
INTERVAL -'08:08' MINUTE TO SECOND
References, etc.
References are identifier chains, which can be a single identifiers or identifiers chains composed of single identifiers
chained together with the period symbol.
identifier chain
identifier chain
<identifier chain> ::= <identifier> [ { <period> <identifier> }... ]
<basic identifier chain> ::= <identifier chain>
A period-separated chain of identifiers. The identifiers in an identifier chain can refer to database objects in a hierarchy.
The possible hierarchies are as follows. In each hierarchy, elements from the start or the end can be missing, but the
order of elements cannot be changed.
Documents you may be interested
Documents you may be interested