<commit_before>{{title}}

`Google.Cloud.Spanner.Data` is the ADO.NET provider for Cloud Spanner. It is the recommended
package for regular Cloud Spanner database access from .NET.

{{version}}

The [Google.Cloud.Spanner.Admin.Instance.V1](../../Google.Cloud.Spanner.Admin.Instance.V1/latest) package
should be used for Cloud Spanner instance administration, such as creating or deleting instances.

{{installation}}

{{auth}}

## Getting started

Operations generally follow ADO.NET conventions.
However Cloud Spanner does not support DML (eg. "INSERT INTO ..."). Therefore you should
use the corresponding API on SpannerConnection to create ADO command objects instead
of setting CommandText manually.

See examples below:

## Sample code

Once you have created your Google Cloud Project and Spanner Instance using the web console,
you can start using the ADO.NET provider to create and modify a Cloud Spanner database.

## Creating a Database and Table

{{sample:SpannerConnection.CreateDatabaseAsync}}<commit_msg>docs: Clarify transaction support for DDL<commit_after>{{title}}

`Google.Cloud.Spanner.Data` is the ADO.NET provider for Cloud Spanner. It is the recommended
package for regular Cloud Spanner database access from .NET.

{{version}}

The [Google.Cloud.Spanner.Admin.Instance.V1](../../Google.Cloud.Spanner.Admin.Instance.V1/latest) package
should be used for Cloud Spanner instance administration, such as creating or deleting instances.

{{installation}}

{{auth}}

## Getting started

Operations generally follow ADO.NET conventions.
However Cloud Spanner does not support DML (eg. "INSERT INTO ..."). Therefore you should
use the corresponding API on SpannerConnection to create ADO command objects instead
of setting CommandText manually.

See examples below:

## Sample code

Once you have created your Google Cloud Project and Spanner Instance using the web console,
you can start using the ADO.NET provider to create and modify a Cloud Spanner database.

## Creating a Database and Table

> **Note**  
> For convenience `Google.Cloud.Spanner.Data` allows you to use standard `SpannerCommand`s
> for DDL operations. But do take into account that Spanner transactions do not support
> DDL operations, so even if you set `SpannerCommand.Transaction` on a DDL command, the command
> will execute outside the transaction.

{{sample:SpannerConnection.CreateDatabaseAsync}}
{'fraction_non_alphanumeric': 0.07618250313938886, 'fraction_numerical': 0.0016743407283382169, 'mean_word_length': 4.930521091811414, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1449712', 'n_tokens_mistral': 612, 'n_tokens_neox': 603, 'n_words': 285}